dedlfix: MYSQL: Deutsche Kollation mit Zeichensatz utf8?

Beitrag lesen

Hi!

Wenn ich latin1 als Verbindungskodierung benutze werden die Zeichen korrekt dargestellt, die Sortierung ist noch immer falsch.

Ja, weil du zwar UTF-8-kodierte Daten gesendet hast - damals beim Eintragen - und MySQL annahm, es wäre Latin1. Die Sortierung funktioniert von selbst richtig, wenn du das Kodierungsproblem gelöst bekommst. Leg dein Augenmerk darauf und lass die Sortierung beiseite.

Ausschnitt aus dem Ergebnis (mit latin1):
B%C3%B6hme - Becker - Carl - D%C3%B6rr - Feldmann
Ausschnitt aus dem Ergebnis (mit utf8):
B%C3%83%C2%B6hme - Becker - Carl - D%C3%83%C2%B6rr - Feldmann
Eigentlich sollte es heißen: Böhme, Becker, Carl, Dörrm, Feldmann (in korrekter Reihenfolge natürlich Becker, Böhme...)

Das bestätigt die Theorie. MySQL liefert dir die Daten so wie es sie bekommen hat - mit zwei Latin1-Zeichen pro damals UTF-8-kodiertem Umlaut. Aus Sicht deiner Anwendung sieht das wie UTF-8 aus.

Bei UTF-8 als Verbindungskodierung werden die zwei Latin1-Zeichen nach UTF-8 umkodiert und das ergibt dann je zwei Byte pro Latin1-Zeichen, also insgesamt vier.

Heißt das, dass die Daten nicht einheitlich kodiert wurden?

Sie wurden zwar einheitlich behandelt, aber falsch interpretiert - als Latin1 und nicht als UTF-8. Und damit kann MySQL sie unter anderem nicht korrekt sortieren.

Und wenn ja, kann ich den Datenbestand auf eine einheitliche Kodierung bringen?

Wenn es nur Testdaten sind, dann lösch sie und fang nochmal mit gesetzter Verbindungskodierung nach jedem Connect an.

Wenn sie erhalten bleiben sollen, dann exportier sie als Latin1. Das kann der phpMyAdmin nur, wenn seinem PHP die iconv-Extension zur Verfügung steht, ansonsten nimmt er immer UTF-8 - und du erhältst (siehe oben) eine doppelte UTF-8-Kodierung. In dem Fall müssen sie in einem Texteditor als UTF-8 eingelesen werden und als ISO-8859-1 gespeichert werden. Nun hast du echte UTF-8-Daten entweder aus dem Latin1-Export oder aus der Editor-Konvertierung. Im Kopf des Dumps könnte sich auch noch eine /*auskommentierte*/ SET NAMES ...-Zeile befinden, die gelöscht werden muss. Nun kannst du einen Import ausführen, dabei aber UTF-8 als Kodierung angeben. Wenn der PMA anschließend alles richtig anzeigt, hast du gewonnen.

Den ganzen Vorgang am besten mit kopierten Tabellen ausführen, nicht dass noch mehr kaputt geht.

Lo!