ORDER BY mit Umlauten
Peter
- datenbank
Hi,
habe eine Tabelle "strassen", deren Inhalt ich alphabetisch (oder heißt das jetzt alfabetisch???) geordnet ausgeben will:
*********************************
SELECT strassen.id,strassen.name FROM strassen ORDER BY strassen.name
*********************************
Allerdings bringt mir das die Umlaute an der falschen Stelle, z.B.:
-Aberweg
-Allerstraße
-Adelweg
-Affenstraße
-Azemutstraße
-Ächterweg
Ich möchte die Umlaute aber bei z.B. "Ae" eingeordnet haben, also in der Reihenfolge:
-Aberweg
-Allerstraße
-Adelweg
-Ächterweg
-Affenstraße
-Azemutstraße
Habe meine Abfrage jetz folgendermaßen umgeschrieben:
*********************************
SELECT strassen.id,strassen.name FROM strassen ORDER BY REPLACE(REPLACE(REPLACE(REPLACE(LOWER(strassen.name),'ä','ae'),'ö','oe'),'ü','ue'),'ß','ss')
*********************************
Wandle also den String erstmal in Kleinbuchstaben um,
im Rückgabewert ersetz ich "ä" durch "ae",
in dem Rückgabewert wiederum ersetz ich "ö" durch "oe" ... usw.
Kommt mir recht aufwändig und nicht sehr elegant vor.
Ne Funktion, mit der ich alles auf einmal ersetzen kann oder etwas ähnliches hab ich auch nicht gefunden.
Gibts da eventuell elegantere Lösungen ?
Wäre für eure Hilfe oder fachmännische Beurteilungen / Kritik an meinem Lösungsansatz dankbar.
Gruß
Peter
Moin!
Ne Funktion, mit der ich alles auf einmal ersetzen kann oder etwas ähnliches hab ich auch nicht gefunden.
Gibts da eventuell elegantere Lösungen ?
Benutze eine aktuelle Version von MySQL. Der kannst du dann sagen, welche Sortierung du gerne hättest (Fachbegriff "Collation"), ohne dass du irgendwelche Zeichenumwandlungen ausführen mußt.
Beispiel: http://dev.mysql.com/doc/mysql/en/charset-collation-effect.html
Eine Alternative wäre, zu jeder deiner Spalten eine Kopie in einer "Sortierspalte" anzulegen, in der entsprechend deiner Wünsche der relevante String dupliziert und verändert wird.
- Sven Rautenberg
Hi,
noch so als Ergänzung zur aktuellen Lösung: Vorsicht mit sovielen String-Operationen in einer Abfrage. Wenn die Datenmenge wächst, dann kann das evtl. mal ein Problem mit dem temporären Speicher des DBMS geben, hatte da mit der DB2 schon diverse Probleme...
MfG
Rouven
Hi,
Benutze eine aktuelle Version von MySQL. Der kannst du dann sagen, welche Sortierung du gerne hättest (Fachbegriff "Collation"), ohne dass du irgendwelche Zeichenumwandlungen ausführen mußt.
Hab ich leider kein Einfluß drauf, is bei 1&1.
Beispiel: http://dev.mysql.com/doc/mysql/en/charset-collation-effect.html
»»
Danke für den Link, is sehr interressant.
Hab das auch mal umgeschrieben jetzt und ausprobiert:
*********************************
SELECT strassen.id,strassen.name FROM strassen ORDER BY strassen.name COLLATE latin1_german2_ci
*********************************
Funktioniert leider nicht, ergibt bei " mysql_fetch_array()" Fehler "supplied argument is not a valid MySQL result resource".
Ab welcher Version geht das denn ?
"info.php" zeigt mir bei "mysql" an:
" Client API version : 4.0.25 "
Eine Alternative wäre, zu jeder deiner Spalten eine Kopie in einer "Sortierspalte" anzulegen, in der entsprechend deiner Wünsche der relevante String dupliziert und verändert wird.
Hab ich auch schon dran gedacht, wollte ich aber möglichst vermeiden.
Gruß+Dank
Peter
Hi,
SELECT strassen.id,strassen.name FROM strassen ORDER BY strassen.name COLLATE latin1_german2_ci
Funktioniert leider nicht, ergibt bei " mysql_fetch_array()" Fehler "supplied argument is not a valid MySQL result resource".
Ergibt wohl eher bei mysql_query ein "You have an error in your SQL syntax near COLLATE" oder so ähnlich.
(Du solltest die Fehler von mysql_query auch ausgeben)
Daß daraufhin der mysql_fetch_array schiefgeht, ist nur ein Folgefehler.
cu,
Andreas
Hi Andreas,
SELECT strassen.id,strassen.name FROM strassen ORDER BY strassen.name COLLATE latin1_german2_ci
Ergibt wohl eher bei mysql_query ein "You have an error in your SQL syntax near COLLATE" oder so ähnlich.
(Du solltest die Fehler von mysql_query auch ausgeben)Daß daraufhin der mysql_fetch_array schiefgeht, ist nur ein Folgefehler.
Ja, du hast recht.
Aber liegt das daran, daß "COLLATE" von meiner DB nicht unterstützt wird oder daß ich die Abfrage falsch formuliert habe ?
Gruß
Peter
echo $begrüßung;
SELECT strassen.id,strassen.name FROM strassen ORDER BY strassen.name COLLATE latin1_german2_ci
Funktioniert leider nicht, [...]
Ab welcher Version geht das denn ?
ab MySQL 4.1
"info.php" zeigt mir bei "mysql" an:
" Client API version : 4.0.25 "
Die MySQL-Client-API ist das Stück Code, dass im Client integriert ist, um auf MySQL-Datenbank-Server zugreifen zu können. Die Server können durchaus eine andere Versionsnummer haben. Abzufragen gehen die Server-Versionsnummern nach einem mysql_connect() mit mysql_get_server_info() oder mit der SQL-Anweisung SELECT VERSION();
echo "$verabschiedung $name";
Hi dedlfix,
Infos und Link waren sehr hilfreich.
Mit "mysql_get_server_info()" erhielt ich die Info:
MySQL server version: 4.0.25
Nach deiner Aussage (ab 4.1 verfügbar) kann das also nicht funktionieren.
Bringt mich zwar bei der Lösung meines eigentlichen Problems (zumindest momentan) nicht weiter, aber ich hab wieder einiges dazugelernt.
Mal schaun, wann 1&1 da mal ne neuere MySQL-Version draufpackt.
Wenns soweit ist kann ich dann ja "COLLATE" verwenden.
Bis dahin bring ich mich schon über die Runden und notfalls ist das ja auch kein Weltuntergang, wenn Ä nach Az eingeordnet wird und nicht bei Ae.
Vielen Dank.
Gruß
Peter