Seite 1 von 1

Bitte helfen Profis: Ich bin am verzweifeln: UTF8 ????

Verfasst: 20.07.2009, 18:17
von Japs
Hallo,
also irgendwie bin ich am verzweifeln - ich habe alles bei mir auf UTF-8 gestellt:

DB = UTF-8 Unicode ( utf8 )
Zeichensatz / Kollation der MySQL-Verbindung = utf8_generali_ci
Kollation der einzellen Felder = utf8_generali_ci
Headerausgabe: <meta http-equiv="content-type" content="text/html;charset=utf-8">
.htaccess = AddDefaultCharset utf-8 / AddCharset utf-8 .php .css
Formular: <form accept-charset="utf-8" metho=.... </form>

Was vergessen ?

So wenn ich jetzt übe rein Formular Wörter mit Umlauten eintrage, dann steht folgendes in der DB:

1. Grossbuchstaben (Ä, Ü, Ö)
Ä
Ö
Ü

2. Kleinbuchstaben (ä, ü, ö)
ä
ö
ü

3. Sonderzeichen (ß)
ß

Frage: Sin das überhaupt die richtigen Zeichen bzw. die richtige Codierung bei UTF-8 ???? Blick echt nicht mehr durch :)

Gruß Dirk

Verfasst:
von

Verfasst: 20.07.2009, 18:45
von Southmedia
dann steht folgendes in der DB:
Wie findest du das heraus? Kommandozeile?

Characterset der Verbindung?

Re: Profis: Ich bin am verzweifeln: UTF8 ????

Verfasst: 20.07.2009, 18:49
von Mork vom Ork
Japs hat geschrieben:So wenn ich jetzt über ein Formular Wörter mit Umlauten eintrage, dann steht folgendes in der DB:

1. Grossbuchstaben (Ä, Ü, Ö)
Ã&#8222;
Ã&#8211;
[&#8230;]
Frage: Sind das überhaupt die richtigen Zeichen bzw. die richtige Codierung bei UTF-8 ????
Solche Krüppeldoppel sind ein untrügliches Zeichen dafür, dass irgendwo die utf-8-Kodierung verschlampt und stattdessen iso-8859-1 verwendet wird.

Bist du sicher, dass über die Verbindung zur Datenbank utf-8 läuft? Was du unter &#8222;MySQL-Verbindung&#8220; angegeben hast, utf8_generali_ci, ist eine Sortierung für Daten.
Du musst den Verbindungszeichensatz explizit in der MySQL-Konfiguration einstellen oder für jede Verbindung neu setzen (per SQL mit set names utf8 oder in PHP über die API mit mysql_set_charset()). In den Datenbank-, Tabellen- und Spalten-Optionen findest du das nicht, diese sind unabhängig vom Datenaustausch mit der Anwendung; MySQL kann ohne weiteres utf-8-kodierte Daten in eine 8859-Tabelle schreiben (wobei allerdings Zeichen verloren gehen können) oder aus einer utf-8-kodierten Tabelle Daten 8859-kodiert an die Anwendung schicken.

Verfasst:
von

Verfasst: 20.07.2009, 19:26
von Japs
Ok thank's dann hab ich wohl echt noch ein Problem - denn ich müsste dann ja noch:

Code: Alles auswählen

mysql_query&#40;"SET NAMES 'utf8' COLLATE 'utf8_general_ci'"&#41;  

irgenwo unterbringen, aber wo genau bzw. wie genau ? Bei mir sieht mein DB - Verbindung nähmlich so aus:

Code: Alles auswählen

// instance the classes
$sql = new SQL;
$sql->connect&#40;$config&#91;'dbhost'&#93;, $config&#91;'dbuser'&#93;, $config&#91;'dbpass'&#93;, $config&#91;'dbdata'&#93;&#41;;
$smarty = new Smarty;
$smarty->template_dir = 'templates/';
$aURL = explode&#40;'/',$_GET&#91;'url'&#93;&#41;;
oder muß es hier:

Code: Alles auswählen

$query ="SELECT * FROM `ferienwohnung` WHERE &#40;Status=1 ";
auch noch danach eingefügt werden ?

Dachte nur an der Stelle, wo die Verbindung zur DB aufgebaut wird ?

Gruß Dirk

Verfasst: 20.07.2009, 20:53
von Japs
Ok das Problem konnte ich lösen - jetzt werden die neuen Einträge unter UTF8 in die DB mit ü,ä,ö etc. eingetragen und auch so wieder ausggegeben - jetzt stehen also keine Ä Ö Ü so mehr in der DB.

Aber jetzt passen alle anderen alten Einträge nicht mehr.
Gibt es eine Möglcihkeit alle alten Einträge in der DB auf einmal in UTF8 zu konvertieren ?

Danke & Gruß Dirk

Verfasst: 20.07.2009, 20:53
von Mork vom Ork
Das Einfachste wäre vermutlich:

Code: Alles auswählen

// instance the classes
$sql = new SQL;
$sql->connect&#40;$config&#91;'dbhost'&#93;, $config&#91;'dbuser'&#93;, $config&#91;'dbpass'&#93;, $config&#91;'dbdata'&#93;&#41;;
$sql->query&#40;'set names "utf8"'&#41;;
...
Oder schau nach, ob die SQL-Klasse selbst irgendwas in der Richtung unterstützt. Stellt sie die Verbindung zur Verfügung, benutze mysql_set_charset();

In jedem Falle muss das nur einmal nach Herstellen der Verbindung, also nach connect() gemacht werden.

Verfasst: 20.07.2009, 21:01
von Mork vom Ork
Japs hat geschrieben:Gibt es eine Möglcihkeit alle alten Einträge in der DB auf einmal in UTF8 zu konvertieren?
Dazu musst du die betreffenden Spalten mittels ALTER TABLE in den Typ BINARY (VARBINARY) konvertieren und anschließend zurück nach CHAR (VARCHAR).

BINARY kennt keine Kodierung, bei der Umwandlung nach BINARY geht die alte, falsche Kodierungsinformation verloren und es bleiben nur die Bytes übrig. Bei der Rückwandlung in CHAR wird diesen Bytes die gewünschte Kodierung dann quasi aufgepropft, ohne dass sich an den Bytes etwas ändert - die Bytes lagen ja bereits richtig vor, lediglich die Information, was sie darstellen, war falsch.

Siehe https://dev.mysql.com/doc/refman/5.1/en ... rsion.html.

Nicht vergessen, vorher eine Sicherheitskopie der Tabelle anzulegen!

Verfasst: 21.07.2009, 08:58
von Japs
Hallo,
Dazu musst du die betreffenden Spalten mittels ALTER TABLE in den Typ BINARY (VARBINARY) konvertieren und anschließend zurück nach CHAR (VARCHAR).
Also irgendwie hat sich da jetzt bei mir gar nix geändert - ich habe in der DB die betreffenden Spalten, welche generell auf "varchar" standen mal mit "BINARY (VARBINARY)" gespeichert und dann wieder zurück mit CHAR (VARCHAR) - aber eine Änderun konnte ich nicht feststellen ????

Gruß Dirk

Verfasst: 21.07.2009, 10:40
von Mork vom Ork
Japs hat geschrieben:mal mit "BINARY (VARBINARY)" gespeichert und dann wieder zurück mit CHAR (VARCHAR) - aber eine Änderun konnte ich nicht feststellen ????
Was heißt &#8222;gespeichert&#8220;? Hast du alter table modify spalte varbinary(123456) und anschließend alter table modify spalte varchar(123456) ausgeführt? Und für die Spalte ist nach der Änderung auch utf8 als Zeichensatz eingestellt?

Verfasst: 21.07.2009, 10:59
von Japs
Ich habs jetzt anders gemacht - ahbe die "alte DB" nochmals in die neue DB importiert und dabei UTF8 angegeben und siehe da - es werden alle Umlaute korrekt dargestellt :)

Jett passt es :)
Gruß & Dank Dirk