de.comp.lang.php.* FAQ

17.15. Wie kann ich Umlaute richtig sortieren?

Keywords: SQL | Datenbank | MySQL | Sortieren | Umlaute

Antwort von Sven Eichler

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ätzlichen 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ärend 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.

Valid HTML 4.01! Valid CSS!

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