Axel Richter: MySQL und osteuropäische Umlaute

Beitrag lesen

Hallo,

habe folgendes Problem: In einer MySQL-Datenbank (MySQL 4.0.2-alpha-nt) soll als VARCHAR der Name 'Rečić' eingegeben werden.

Wenn ich über phpMyAdmin 2.3.0 diesen Namen eingebe, wird er als 'Rečić' abgelegt.

Ja, weil die Zeichen im charset=ISO-8859-1 http://www.fileformat.info/info/charset/ISO-8859-1/grid.htm, welches wahrscheinlich als Standard charset eingestellt ist, nicht vorhanden sind, werden sie als Entities codiert.

Wenn ich ein entsprechendes SQL_Statement (INSERT) direkt aus PHP verwende, ist das Ergebnis 'Reèiã', also auch nicht das gewünschte.

Wie machst Du das? Indem Du im PHP-Quelltext
$SQLString = "INSERT INTO tabelle (Nachname) VALUES ('Rečić');
eingibst? Damit hast Du allerdings mit der Tastatur Zeichen erzeugt, die es in charset=ISO-8859-1 nicht gibt. Als einzelne Bytes gibt es die nur in charset=ISO-8859-2 http://www.fileformat.info/info/charset/ISO-8859-2/grid.htm
Jedes Zeichen wird als Byte gespeichert. Du speicherst die Bytes
R  e  č  i  ć
%52%65%e8%69%e6

Weil dann für die Ausgabe aber wieder charset=ISO-8859-1 genutzt wird, ergibt sich:
%52%65%e8%69%e6
R  e  è  i  æ

Zum einen scheint phpMyAdmin also die Umlaute selber in Entities zu mappen, andererseits kann MySQL offensichtlich die Sonderzeichen nicht korrekt speichern.

MySQL speichert Byte-Daten. Solange jedes Zeichen nur ein Byte sein darf, muss mann bei der Ausgabe wissen, welches charset angewendet werden muss. Erst Unicode bringt dort Abhilfe. Dort können für ein Zeichen mehrere Bytes gespeichert werden. Damit sind mit einem charset, z.B. charset=UTF-8, alle Zeichen darstellbar.

Hat da jemand für mich vielleicht einen Tipp, wie ich die Datenbank mit 'rohen' Daten beschreiben kann, also im konkreten Fall mit 'Rečić'?

Du speicherst sowieso die rohen Daten, also %52%65%e8%69%e6. Es kommt drauf an, wie Du sie ausgibst.

Mehrere Möglichkeiten:
1. Nutze für unterschiedliche Sprachgebiete unterschiedliche charsets im HTML-Formular und speichere irgendwo ab, welche Daten Du mit welchem charset bekommen hast, um sie dann auch mit diesem charset wieder auszugeben.

2. Nutze immer charset=ISO-8859-1 und lebe damit, dass die Browser dann Zeichen, die es in diesem charset nicht gibt, als Entity senden. Damit leben heißt, berücksichtige das beim Suchen, Ersetzen, Sortieren....

3. Nutze konsequent Unicode charset=UTF-8. Bei MySQL 3.x hast Du da aber offensichtlich schlechte Karten.

viele Grüße

Axel