bei LIKE u und ü unterscheiden
Gast
- datenbank
Hallo,
für das Autocomplete habe ich eine kleine PHP Routine geschrieben.
Wenn ich nun "bur" eingebe (suche nach Burg Grafenstein), kommt auch "bür", also etwa Bürgerhäuser. Das ist nicht erwünscht.
Habe hier nachgelesen, aber die separate Erkennung von Umlauten wird nicht erklärt. ü = ue macht Sinn, aber nicht ü = u
Wie geht das?
Gruß, Gast
Tach!
Habe hier nachgelesen, aber die separate Erkennung von Umlauten wird nicht erklärt. ü = ue macht Sinn, aber nicht ü = u
Im ersten Beispiel zu LIKE steht ein versteckter Hinweis auf die Kollation.
Wie geht das?
Für Vergleichsoperationen sind die Regeln der Kollationen zuständig. Diese wird entweder aus dem verwendeten Feld entnommen oder explizit wie im Beispiel gesetzt.
dedlfix.
Moin auch,
Für Vergleichsoperationen sind die Regeln der Kollationen zuständig. Diese wird entweder aus dem verwendeten Feld entnommen oder explizit wie im Beispiel gesetzt.
Au weia, da muss ich wohl erst studieren gehen.
Jetzt google ich schon eine halbe Stunde, um die genauen Kollate- Möglichkeiten nachzulesen, habe aber nichts Brauchbares gefunden. Immer wieder kommt diese Seite, die aber keine Auskunft gibt, wie es genau gehandhabt wird.
Vielleicht sollte ich noch einen Kaffee trinken zum wach werden. Oder 'ne Pulle Schnaps, dann ist mir das Thema schnuppe ;-)
Gast
Hier eine Meinung zu ä = ae, leider ohne Quellenangabe (nur ein vager Hinweis auf das "MYSQL-Handbuch"):
"Beim Zeichenkettenvergleich mit LIKE wird das Mapping von einem auf zwei Buchstaben nicht durchgeführt. Alle Buchstaben werden in Großschreibung umgewandelt. Akzente werden aus allen Buchstaben entfernt, mit folgenden Ausnahmen: Ü, ü, Ö, ö, Ä und ä."
Wenn ich wörtlich nach dem ersten Satz dieses Zitats google, kommt kein "Handbuch".
Meinung kann stimmen oder auch nicht. Gut, dass mein Kaffee gerade leer ist, da kann ich mal im Kaffeesatz nachschauen. Der sagt: Alles Quatsch, das Handbuch wurde zurückgezogen, weil dieses Thema viel zu kompliziert ist, um es zu beschreiben.
Gast
Tach!
Au weia, da muss ich wohl erst studieren gehen.
Scheiß Sprachen- und Schriftvielfalt - man sollte weltweit nur noch eine Sprache erlauben, C vielleicht ...
Aber erst wenn ich tot bin, bitte. Das wäre mir sonst zu langweilig.
Jetzt google ich schon eine halbe Stunde, um die genauen Kollate- Möglichkeiten nachzulesen, habe aber nichts Brauchbares gefunden. Immer wieder kommt diese Seite, die aber keine Auskunft gibt, wie es genau gehandhabt wird.
Das heißt also, dass du UTF-8 verwendest. Dann ist die Seite eigentlich die richtige. Was du willst, ist aber mit keiner der für Deutsch vorgesehenen Kollationen (*_general_ci und *_unicode_ci) erreichbar, weil diese beiden die Umlaute auch mit den Grundvokalen gleichsetzen (abgesehen von der Handbuchaussage zu LIKE). Für deinen Zweck wäre vielleicht utf8_bin das richtige, allerdings gilt dann auch nicht ü=ue oder X=x. Letzteres könnte man mit einer Groß- oder Kleinschreibwandlung auf beiden Seiten des Vergleichs hinbekommen.
Hier eine Meinung zu ä = ae, leider ohne Quellenangabe (nur ein vager Hinweis auf das "MYSQL-Handbuch"):
"Beim Zeichenkettenvergleich mit LIKE wird das Mapping von einem auf zwei Buchstaben nicht durchgeführt. Alle Buchstaben werden in Großschreibung umgewandelt. Akzente werden aus allen Buchstaben entfernt, mit folgenden Ausnahmen: Ü, ü, Ö, ö, Ä und ä."
So ähnlich stand es ja schon auf der eingangs von dir verlinkten Seite, nur ohne den zweiten Teil mit der Umwandlung nebst Ausnahme. Es kann sein, dass dann diese Aussage nicht (mehr) stimmt. Das müsstest du mal probieren, ich weiß das auch nicht genau.
dedlfix.
Tach!
Das heißt also, dass du UTF-8 verwendest.
Joop.
Für deinen Zweck wäre vielleicht utf8_bin das richtige, allerdings gilt dann auch nicht ü=ue oder X=x. Letzteres könnte man mit einer Groß- oder Kleinschreibwandlung auf beiden Seiten des Vergleichs hinbekommen.
okay:
AND UPPER(trp1.treffpunkt) LIKE '".strtoupper($arr_in['v'])."%' COLLATE utf8_bin
wird umgesetzt zu
AND UPPER(trp1.treffpunkt) LIKE 'Bü%' COLLATE utf8_bin
Folgeproblem bei PHP:
strtoupper: "Beachten Sie, dass die Erkennung von 'Buchstaben' vom Wert locale abhängig ist. Ist z. B. die Voreinstellung für locale "C", werden Sonderzeichen wie Umlaute (ä, ö, ü) nicht umgewandelt. "
Also google ich wieder nach locale, wie kann man das beeinflussen?
Aha:
"/* versuche verschiedene mögliche locale Namen für Deutsch ab PHP 4.3.0 */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo "Preferred locale for german on this system is '$loc_de'";
Habe ich eingesetzt. Aber nöö, doch nicht. Da muss ich wohl wieder auf meinen Kaffeesatz zurückgreifen. Oder war "Versuche verschiedene Möglichkeiten" die Glaskugel?
Hat jetzt mit Logik nichts mehr zu tun.
Gast
Tach!
Folgeproblem bei PHP:
strtoupper: "Beachten Sie, dass die Erkennung von 'Buchstaben' vom Wert locale abhängig ist. Ist z. B. die Voreinstellung für locale "C", werden Sonderzeichen wie Umlaute (ä, ö, ü) nicht umgewandelt. "
PHPs Standard-Funktionen können nicht mit UTF-8 umgehen und das unabhängig von der locale-Einstellung. Nutze die mb_*-Funktionen oder lass das DBMS die Umwandlung vornehmen.
dedlfix.
n'Abend,
PHPs Standard-Funktionen können nicht mit UTF-8 umgehen und das unabhängig von der locale-Einstellung. Nutze die mb_*-Funktionen oder lass das DBMS die Umwandlung vornehmen.
Scheint die Lösung zu sein:
AND UPPER(trp1.treffpunkt) LIKE UPPER ('bü%') COLLATE utf8_bin
Bürgerweg 5, Tannenhof, D-35579 Wetzlar
Bürgerweide, Landwirtschaftszelt, D-28195 Bremen
Danke.
Gast