Sandy: utf8 als latin1 => konvertierung per blob schlägt fehlt

Hallo Allemann,

ich habe mich nur durch eine Menge Threads zum Thema utf-8 Speicherung von Daten gequält und auch schon eine Menge dazugelernt.

Ich habe eine Zeitlang - nicht wirklich sauber - utf-8 Daten in latin1 Datenbankfeldern gespeichert (mysql-DB). Da man das nicht wirklich so lassen kann, muss ich die ganze Geschichte jetzt umstellen.

Ist ja auch nicht weiter schlimm. Alle Textfelder (varchar,char,text etc.) in Blob umwandeln - ALTER TABLE blablubb CONVERT TO CHARACTER SET utf8 - zwischenzeitlich die Felddefinitionen merken und dann wiederherstellen. Also zurückwandeln in varchar, text oder was immer es vorher war.

Das Problem an der ganzen Geschichte ist nur, dass die Felder gekürzt werden. Habe noch nicht rausgefunden, ob es da eine bestimmte Regel gibt, aber wo vorher das stand:

'Да. При оплате покупки с помощью бонусов, Вам не будут начислены бонусы с той части суммы, которая оплачивается ранее полученными бонусами. Это правило в дальнейшем может меняться, поэтому советуем Вам следить за обновлениями на сайте.' (Das war vorher in phpmyadmin nicht wirklich in dieser form zu lesen - alles mehr oder weniger Datenmüll, weil utf8 als latin gespeichert war.)

Steht jetzt das:

'Да. При оплате покупки
(In phpmyadmin sieht's perfekt aus und auf der Seite auch, wenn ich SET NAMES utf8 nach der connect einsetze - aber es ist zu kurz.)

D.h. mir geht bei der Blob-Wandlung etwas verloren. Mir ist rätselhaft wie das passieren kann - ich dachte der Feldinhalt wird verkapselt und gut ist.

Hat jemand sowas schonmal gemacht und vielleicht eine Lösung?

Vorgehensweise ist folgende:
1. ALTER TABLE translations\_werte CHANGE varwert varwert BLOB NOT NULL
2. ALTER TABLE translations\_werte CONVERT TO CHARACTER SET utf8
3. ALTER TABLE translations\_werte CHANGE varwert varwert TEXT NOT NULL

Hat jemand eine Idee?

Gruss,
Sandy

  1. echo $begrüßung;

    Das Problem an der ganzen Geschichte ist nur, dass die Felder gekürzt werden. Habe noch nicht rausgefunden, ob es da eine bestimmte Regel gibt, aber wo vorher das stand:
    Hat jemand eine Idee?

    Nicht wirklich, aber ...

    Alle Textfelder (varchar,char,text etc.) in Blob umwandeln - ALTER TABLE blablubb CONVERT TO CHARACTER SET utf8 - zwischenzeitlich die Felddefinitionen merken und dann wiederherstellen. Also zurückwandeln in varchar, text oder was immer es vorher war.

    Warum so umständlich? Wenn Inhalt und Kodierungs- bzw. Kollationsangabe von Feldern bisher simmten, also beim Anzeigen mit dem phpMyAdmin alle Zeichen ordentlich dargestellt wurden, brauchst du nur die Kodierungs/Kollationsangabe umzustellen, und MySQL kümmert sich um die ordnungsgemäße Umwandlung der Feldinhalte.

    'Да. При оплате покупки с помощью бонусов, Вам не будут начислены бонусы с той части суммы, которая оплачивается ранее полученными бонусами. Это правило в дальнейшем может меняться, поэтому советуем Вам следить за обновлениями на сайте.' (Das war vorher in phpmyadmin nicht wirklich in dieser form zu lesen - alles mehr oder weniger Datenmüll, weil utf8 als latin gespeichert war.)

    Achso, dann ist es natürlich etwas aufwendiger als die Angabe umzustellen, aber der Zwischenschritt mit dem BLOB wäre nicht nötig. Am einfachsten wäre noch ein Dump als Latin1 gewesen, der mit "Kodierung = utf8" nach Umstellen der Kodierungsangabe wieder eingelesen wird.

    (In phpmyadmin sieht's perfekt aus und auf der Seite auch, wenn ich SET NAMES utf8 nach der connect einsetze - aber es ist zu kurz.)
    D.h. mir geht bei der Blob-Wandlung etwas verloren.

    Nach der Umwandlung sieht es im phpMyAdmin immer noch richtig aus und beim Abfragen mit deinem Script ist es zu kurz? Der phpMyAdmin kocht auch nur mit Wasser. Ich vermute einen Fehler in deiner Verarbeitung. Kontrollierst du die Variableninhalte direkt nach dem Fetchen? Schaust du auch mal in den Quelltext der HTML-Seite, wenn du dahinein ausgeben lässt?

    echo "$verabschiedung $name";

  2. Ich habe eine Zeitlang - nicht wirklich sauber - utf-8-Daten in latin1-Datenbankfeldern gespeichert (mysql-DB).

    1. ALTER TABLE translations\_werte CHANGE varwert varwert BLOB NOT NULL
    2. ALTER TABLE translations\_werte CONVERT TO CHARACTER SET utf8
    3. ALTER TABLE translations\_werte CHANGE varwert varwert TEXT NOT NULL

    Das Problem an der ganzen Geschichte ist nur, dass die Felder gekürzt werden. Habe noch nicht rausgefunden, ob es da eine bestimmte Regel gibt

    Auch wenn convert to keine Auswirkung auf Blobs haben soll: Probiere es, wie in der Anleitung zu convert to character set ausdrücklichst beschrieben, ohne Konvertierung:

    ALTER TABLE t1 CHANGE c1 c1 BLOB;
    ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;

    Dass bei dir Zeichen verloren gehen, könnte daran liegen, dass MySQL während deiner Umwandlungsprozedur über ungültige Bytefolgen stolpert und an der Stelle abbricht.