hallo,
kann mir jemand verraten wie man am besten Datensätze sortiert ?
bisher habe ich immer alles über das orderBy der Mysqlabfrage geordnet.
$GLOBALS['TYPO3_DB']->exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='')
Jetzt habe ich aber Datensätze die Umlaute enthalten oder mit einem Umlaut beginnen.
z.B.
A,B,C
wird bei Umlauten zu
A,Ö,B,C
würde jedoch gerne das Ö beim O haben.
Gibt es hier eventuell ein paar API oder PHP Funtionen die die Sortierung dahin gehend beeinflusen können ?
karlchen
Hallo,
die Sortierung ist ein weites Feld ...
Dabei kommt es auf die DB-Version, das Encoding (UTF-8 oder ISO) und die Collation an. So viel zur Vorrede ...
Wenn das Character Set einer mysql-Spalte auf UTF-8 gesetzt ist (wie es so der moderne Ansatz ist) dann kann man nicht richtig nach Umlauten sortieren.
was funktioniert ist die Sortierung "Ä" wie "A" einsortieren, also
Abfall
Ameise
Äpfel
Arktis
Dazu kann man die Collation der Spalte auf utf8_unicode_ci stellen. Fertig.
Meist wird aber die Sortierung "Ä" wie "Ae" gewünscht, also
Abfall
Äpfel
Ameise
Arktis
Das geht mit UTF-8 nicht. Die korrekte Collation dafür wäre utf8_german2_ci. Diese gibt es noch nicht, soll aber mit mysql6 verfügbar sein (irgendwo habe ich auch gefunden: ab mysql 5.1 konnte ich aber nicht checken).
Alternative A: Spalte auf latin1 mit Collation latin1_german2_ci stellen. Bedeutet: kein UTF-8 mehr in dieser Spalte. Nicht schön.
Alternative B: Umwandeln der Spalte beim Selektieren: ORDER BY cast(spaltenname as char(100) character set latin1) collate latin1_german2_ci
Ich wünsch dir viel Erfolg!
hallo meckpo,
danke für die Tipps :-)
Ich habe in der DB mal nachgesehen, die besagte Tabelle hat Collation latin1_swedish_ci.
und in meinem Beispiel ist Österreich als "Österreich" hinterlegt.
wenn ich deine Alternative B ausprobieren, wird die Sortierung auch geändert, doch scheinbar, wird hier der erste Buchstabe als A interpretiert und daher auch die komische Reihenfolge.
Ich werde daher mal weiter probieren, während der Abfrage eine "korrekte Sortierung" vorzunehmen.
Hallo Karlchen,
dein Problem liegt wahrscheinlich tiefer: Deine DB-tabelle ist auf ISO gestellt und dein Typo3-Projekt wahrscheinlich auf UTF-8. Daher die "komischen" DB-Einträge. Versuch mal die Collation der Spalte nach der du sortierst auf UTF-8 zu stellen.
Achtung: Vor irgendwelchen Experimenten immer schön ein Backup der betroffenen Tabelle(n) machen!
Wie gesagt: Die Sortierung ist ein weites Feld!
Hallo meckpo,
da es sich hier um ein ProduktivSystem handelt, würde ich eine Änderung der Collation der betroffenen Tabelle erst machen wollen wenn nichts anderes mehr geht.
Gibt es denn einen Unterschied zwischen dem umstellen der Tabelle und der "Umwandlung" bei der DB Abfrage ?
Hallo Karlchen,
wie gesagt: für mich sieht das so aus, als ob UTF-8-Zeichen in eine ISO-Tabelle geschrieben werden. Jetzt kannst du natürlich verzweifelt irgendwelche Typen-Umwandlungen während der Abfrage versuchen. Das funktioniert dann vielleicht noch mit einer selbstgeschriebenen Extension aber das Problem bleibt natürlich. Wenn es das ist was ich vermute, ist das auch nicht so einfach zu lösen. Denn du müsstest die Kodierung der Tabelle (oder der gesamten DB?) umstellen und alle Daten die jetzt schon drin sind umwandeln. Das ist alles andere als trivial.
Um einzukreisen, woran es eigentlich wirklich liegt kannst du doch mit phpMyAdmin einfach eine Kopie der betreffenden Tabelle erzeugen und dann ebenfalls per phpMyAdmin SQL-Queries auf dieser Kopie ausführen. Dann kannst du austesten, was wirklich hilft.
PS: Das Ändern einer Collation ist unkritsich, die gibt eben nur an, wie Datensätze sortiert werden sollen. Sie hat nichts mit der Speicherung der Daten zu tun.
danke meckpo,
ja, ich denke du hast recht.
Es werden UTF-8 Zeichen in einer ISO Tabelle abgelegt.
Genau in diesem Punkt ist es auch eine selbstgeschriebene Extension, wo ich die Abfragen selber "zusammenbasteln" kann.
Ich glaube ich bau mir hier noch mal ein testsystem zusammen, und versuch dann einen Guten Weg zu finden, alles ins reine zu bringen.
Vielen Dank noch mal für die hilfe 🙂
karlchen