Andreas: MySQL und osteuropäische Umlaute

Hallo Forum,

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. Da ich die Namen mit PHP htmlentities() ausgebe, erscheint er dann genauso im Browser.

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

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

Den Beitrag http://forum.de.selfhtml.org/archiv/2004/3/t75781/#m436503 habe ich gelesen, ich möchte allerdings nicht den vorgeschlagenen 'quick and dirty'-Weg gehen, da auch eine Ausgabe in PDF vorgesehen ist.

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ć'?

Vielen Dank und Gruß aus München von
Andreas

  1. Hallo Andreas,

    ich hab ihn nicht ganz gelesen, andere Baustelle, aber weiter unten wurde im Unicode-Zusammenhang auf diesen Artikel verwiesen: http://dev.mysql.com/tech-resources/articles/4.1/unicode.html, vielleicht hilft der Dir weiter.

    Gruß aus Köln-Ehrenfeld,

    Elya

  2. Hi,

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

    Das klingt als ob  Character-set/Collaction in MySQL geaendert werden muessen.

    Gruss,
    Melanie

    1. Hallo Melanie, hallo Elya,

      Das klingt als ob  Character-set/Collaction in MySQL geaendert werden muessen.

      Collations gibt´s leider erst ab MySQL 4.1 und die steht mir nicht zur Verfügung ;-)

      Trotzdem erstmal Danke!

      Gruß, Andreas

  3. 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