Umlaute in MySQL sortieren
Matthias
- datenbank
Hallo,
Ich lasse mir den Inhalt einer Tabelle sortieren:
... ORDER BY $feld1 ASC
In $feld1 sind allerdings Umlaute enthalten.
Dies führt dazu, dass beispielsweise "Öffentliches Recht"
entweder ganz am Ende bzw. in Falle von "Öffentliches Recht" ganz am Anfang der Liste steht.
Gibt es eine Möglichkeit, die Sortierung auch auf Umlaute korrekt anzuwenden? (Ich benutze PHP für die Abfrage)
Danke für Eure Hilfe,
Matthias
Hi
In $feld1 sind allerdings Umlaute enthalten.
PHP kann Umlaute behandeln, das heisst bevor Du die Daten in die DAtenbank packst solltest du den String so konvertieren, dass er normale Umlaute enthält (also ö anstatt ö)
da gibts es auch einen PHP befehl dafür,
die funktionen htmlentities() oder htmlspecialcharakter könnten da hilfreich sein. Und dann genauso wieder zurückwandeln, wenn nötig
Uli
Hi
In $feld1 sind allerdings Umlaute enthalten.
PHP kann Umlaute behandeln, das heisst bevor Du die Daten in die DAtenbank packst solltest du den String so konvertieren, dass er normale Umlaute enthält (also ö anstatt ö)
da gibts es auch einen PHP befehl dafür,
die funktionen htmlentities() oder htmlspecialcharakter könnten da hilfreich sein. Und dann genauso wieder zurückwandeln, wenn nötig
Uli
Hallo zusammen.
ich galube, der Aufwand ist unnötig. MySQL scheint eine sehr vernünftige Datenbank zu sein. Die hat nämlich einen "alternate collating key". Das bedeutet, dass beim Starten der DBE eine Ordinaltabelle für die Sortierung geladen wird.
Ich suche das gerade. Kapitel 12. aber ich komme nicht rein in meine Datenbank. Der Server scheint down zu sein. Komme gleich wieder.
Gruß
Tom
Hi,
MySQL scheint eine sehr vernünftige Datenbank zu
sein. Die hat nämlich einen "alternate collating
key". Das bedeutet, dass beim Starten der DBE eine
Ordinaltabelle für die Sortierung geladen wird.
trotz Verwendung dieser Tabelle werden beim Sortieren
aber immer noch Zeichen mit Zeichen verglichen und nicht
Zeichen mit Strings (HTML-Entities).
Um das Zurückwandeln der Entites kommst Du damit nicht
herum.
Viele Grüße
<img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael
Hi,
MySQL scheint eine sehr vernünftige Datenbank zu
sein. Die hat nämlich einen "alternate collating
key". Das bedeutet, dass beim Starten der DBE eine
Ordinaltabelle für die Sortierung geladen wird.
trotz Verwendung dieser Tabelle werden beim Sortieren
aber immer noch Zeichen mit Zeichen verglichen und nicht
Zeichen mit Strings (HTML-Entities).
Um das Zurückwandeln der Entites kommst Du damit nicht
herum.
Ja, das Problem bleibt:
eszet also ß
plus steht vor minus
ss
Schreibweisen mit Bindestrich und ohne
Bei Adresslisten hätte man ja gerne Str. und Strasse und Straße gleichwertig
Groß-Kleinschreibung
Das Problem kann man nur mit einem berechneten Matchcode lösen, der in einem extra Feld steht und dann erst unter Index gestellt wird.
Ich hatte das Problem schon mal bei dr Postleitzahlumstellung. Das wurden Programme benötigt, die irgendwie wilde Straßenangaben in fremder Leute Datenbanken so auf den eigentlichen Informationsgehalt reduzieren, dass sie wieder sortierbar und erkennbar werden. Es hat geklappt.
Gruß
Tom
Hi Tom,
Ja, das Problem bleibt:
eszet also ß
plus steht vor minus
nein, nichts von alledem. Das läßt sich alles über eine collating
sequence lösen, sofern alle zu sortierenden Zeichen "gleich lang"
sind.
Aber sortiere mal "über" gegen "unter", _ohne_ die Entity vorher
umzuwandeln (egal, in welchem Zeichensatz)! Da hilft keine Tabelle mehr.
Viele Grüße
<img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael
Hi Tom,
Ja, das Problem bleibt:
eszet also ß
plus steht vor minus
nein, nichts von alledem. Das läßt sich alles über eine collating
sequence lösen, sofern alle zu sortierenden Zeichen "gleich lang"
sind.
Aber sortiere mal "über" gegen "unter", _ohne_ die Entity vorher
umzuwandeln (egal, in welchem Zeichensatz)! Da hilft keine Tabelle mehr.
Hai Michael,
ja, das will ich nicht anweifeln, dass es da ein Problem gibt. Man müßte sich also eine Tabelle bauen (einbauen in MySQL) ind er für jedes Zeichen bzw. für jede Zeichenkombination, die man behandeln will, eine Funktion eingebaut ist. Schlußendlich muss alles wieder in einer Ordialtabelle enden. Dabei kann es passieren, dass man dan acuh leicht auf die soundex()-Funktion stösst...
Die ist nämlich so ähnlich aufgebaut.
Für die Umwandlung von Sonderzeichen in HTML gibt es in PHP ja zum Glück die Funktion htmlentities(). Aber was ist mit der Rückwandlung. Die kommt zwar nur vor, wenn ich HTML-Seiten indizieren will, aber ich trotzdem keine Funktion gefunden.
Wie ist das mit den anderen Sprachen?
Bleibt einem wieder nix anderes übrig, als auf C runterzugehen, damit die Performance nicht in die Knie geht.
Gruß
Tom
Hallo nochmal,
bin eben schnell runtergeflitzt in die Bibliothek. Man gut, dass es noch Bücher gibt.
Ich schreibe das mal ab:
Wenn Sie eine andere Sortierordnung bevorzugen, müssen Sie die Option /default-character-set/ in der MySQL-Konfigurationsdatei ändern.
Für jeden unterstützten Zeichensatz finden Sie im Verzeichnis mysql/share/charsets eine *conf-Datei. Falls MySQL dieses Verzeichnis nicht findet, müssen Sie dessen Ort mit der Option /character-set-dir/ angeben.
Das fertige Set, dass Du brauchst ist "german1" Laut um Umlaut werden als gleichwertig behandelt, Die Upper89 und Lower() Funktionen funxen dann auch.
Man kann die Tabellen auch selber umstricken. Ist aber ein bisschen kompliziert. Habe ich das letzte Mal vor 10 Jahren gemacht. Da hieß MySQL noch BTrieve.
Gruß
Tom
Hallo Mathias,
Dies führt dazu, dass beispielsweise "Öffentliches Recht"
entweder ganz am Ende
Du hast ein Locale-Problem ;-)
Du solltest dir mal
http://www.mysql.com/doc/G/e/German_character_set.html
anschauen. MySQL mit '--default-character-set=latin_de' gestartet
sollte die Woerter mit Umlauten richtig sortieren. Sollte dir diese
Moeglichkeit nicht zur Verfuegung stehen, fuege eine weitere Spalte
hinzu, in der du vor dem 'insert' alle Umlaute ersetzt durch ihr
Pendant ('ö' beispielsweise wuerde zu 'oe', 'ü' wuerde zu 'ue').
bzw. in Falle von "Öffentliches Recht" ganz am Anfang der
Liste steht.
Also, mit HTML-Entities kann MySQL nicht umgehen. Ist auch nicht
seine Aufgabe. Das ist deine und die des Browsers.
Gruesse,
CK