Gelegentlich 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:
Wer Zugriff auf mysql-Einstellungen hat kann diese Möglichkeit anwenden: MySQL-FAQ
Erzeugen einer zusätzlichen Sortier-Spalte in MySQL-Tabellen
Direkt beim Auslesen der Daten eine Umlautformatierung und Sortierung vornehmen
Zusätzliche Sortier-Spalte
Anhand 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ährend des Auslesens
Das 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.






