17.15. Wie kann ich Umlaute richtig sortieren?Antwort von Sven EichlerGelegentlich steht man vor dem Problem, Tabelleinhalt mit Text richtig sortiert auslesen zu müssen, welcher auch Umlaute enthält. Das ist aber bei MySQL nicht so ohne weiteres möglich, da MySQL standardmäßig einen Zeichensatz unterstützt, der eine Sortierung mit Umlauten nicht nach unserem natürlichen Verständnis unterstützt. Eine bessere Beschreibung dieses Problems findet sich in der MySQL-FAQ der Newsgroup de.comp.datenbanken.mysql. Es gibt 3 Lösungsmöglichkeiten:
zusätzlichen Sortier-SpalteAnhand einer Tabelle mit Namen sei die Lösung mit der zusätzlichen Sortier-Spalte hier kurz erläutert. Follgende Tabelle ist gegeben: +----+------------+ | ID | Name | +----+------------+ | 1 | Äußerung | | 2 | Österreich | | 3 | Überfluss | +----+------------+ Diese Tabelle wird nun um eine Spalte erweitert, in der später die Namen stehen, nach denen sortiert werden kann. Ich nenne die Spalte einfach sortiert. Diese Spalte sollte die gleichen Eigenschaften haben, wie die Spalte Name. ALTER TABLE tabelle ADD sortiert VARCHAR(255) NOT NULL Nun sieht unsere Tabelle so aus: +----+------------+----------+ | ID | Name | sortiert | +----+------------+----------+ | 1 | Äußerung | | | 2 | Österreich | | | 3 | Überfluss | | +----+------------+----------+ Die Umwandlung der Umlaute kann nun mit einer einzigen MySQL-Anweisung erfolgen: mysql_query("UPDATE tabelle SET sortiert = REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(Name, 'Ä', 'A'), 'Ö', 'O'), 'Ü', 'U'), 'ä', 'a'), 'ö', 'o'), 'ü','u'), 'ß', 's')"); ... Hierbei ist Name die entsprechende Tabellenspalte, aus der die umzuwandelnden Namen genommen werden. Es dürfen für den Spaltennamen keine Hochkommas verwendet werden! Die fertige Tabelle sollte jetzt so aussehen: +----+------------+------------+ | ID | Name | sortiert | +----+------------+------------+ | 1 | Äußerung | Ausserung | | 2 | Österreich | Osterreich | | 3 | Überfluss | Uberfluss | +----+------------+------------+ Richtig sortiert lässt sich das Ganze nun so auslesen: $result = mysql_query("SELECT * FROM tabelle ORDER BY sortiert"); Anwendung in laufenden Scripten mit MySQL: $name = "irgend ein Name"; mysql_query("INSERT INTO tabelle (Name, sortiert) VALUES('$name', REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(Name, 'Ä', 'A'), 'Ö', 'O'), 'Ü', 'U'), 'ä', 'a'), 'ö', 'o'), 'ü','u'), 'ß', 's'))"); oder mit PHP: $name = "irgend ein Name"; $sortiert = strtr($name, "ÄÖÜäöüß", "AOUaous"); mysql_query("INSERT INTO tabelle (Name, sortiert) VALUES('$name','$sortiert')"); Umlautsortierung wärend des AuslesensDas Sortieren nach einer bestimmten Spalte kann auch während einer Abfrage stattfinden: mysql_query("SELECT *, REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(Name, 'Ä', 'A'), 'Ö', 'O'), 'Ü', 'U'), 'ä', 'a'), 'ö', 'o'), 'ü','u'), 'ß', 's') AS sortiert FROM tabelle ORDER BY sortiert"); Zu bedenken ist dabei allerdings, dass die Serverlast eine nicht zu unterschätzende Rolle spielen kann. Wenn es zuviele gleichzeitige Zugriffe auf den Server gibt bzw. wenn es zuviele zu bearbeitende Datensätze gibt, kann die Performance empfindlich darunter leiden. |
||
17.15. Wie kann ich Umlaute richtig sortieren? http://www.php-faq.de/q/q-mysql-umlaute-sortieren.html |
||
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team |