mySQL: Nach e suchen, und auch é finden
Linuchs
- datenbank
Moin,
wenn ich in einer WHERE Klausel nach cafe
suche, möchte ich auch café
finden.
Ich erinnere mich, dass es da einen Zusatz gibt, aber wie ist das Stichwort?
Und wäre mit dieser Lösung auch abgedeckt, dass Umlaute zu den Lauten gefunden werden? Bei nicht-deutschen Tastaturen gibt es ja keine Umlaute.
Linuchs
wenn ich in einer WHERE Klausel nach
cafe
suche, möchte ich auchcafé
finden. Ich erinnere mich, dass es da einen Zusatz gibt, aber wie ist das Stichwort?
collation
Hallo Linuchs,
Alle _ci Collations sind - sofern kein _as im Collation-Name ist, automatisch accent insensitive. Wenn die Tabelle, in der Du unterwegs bist, eine _cs Collation verwendet, musst Du den COLLATE Zusatz verwenden
Rolf
Die Felder in den Tabellen haben die Kollation utf8_unicode_ci. Also brauche ich als Suffix _ai. Nun habe ich versucht:
AND ( UPPER( trm1.titel ) LIKE '%CAFE%' COLLATE utf8_unicode_ai # Accent insensitive
1273: Unknown collation: 'utf8_unicode_ai'
Auch utf8_ai und utf8_unicode_ci_ai war falsch.
Linuchs
Hello,
AND ( UPPER( trm1.titel ) LIKE '%CAFE%' COLLATE utf8_unicode_ai # Accent insensitive
Versuch mal
AND trm1.titel LIKE _urf8'%CAFE%' -- Accent insensitive
Wenn deine Spalten bereits utf8_unicode_ci codiert angelegt sind (was gut ist!), dann brauchst/darfst Du keine zusätzliche COLLATE-Klausel mehr im Statement benutzen. Du musst aber dafür sorgen, dass der gesuchte Wert wirklich utf-8-kodiertz ist. Vielleicht ist ja dort der Fehler zu suchen?
Upper() musst Du auch nicht mehr verwenden, wenn Du die Spalte nicht BINARY o. ä. angelegt hast.
Liebe Grüße
Tom S.
Tach!
Wenn deine Spalten bereits utf8_unicode_ci codiert angelegt sind (was gut ist!), dann brauchst/darfst Du keine zusätzliche COLLATE-Klausel mehr im Statement benutzen. Du musst aber dafür sorgen, dass der gesuchte Wert wirklich utf-8-kodiertz ist.
Dazu muss man auch nichts im Statement ergänzen. Wenn man da was angeben muss, weil es sonst nicht funktioniert, hat man eher einen grundsätzlichen Fehler im System drin. Wichtig ist nur, dass man die Kodierung nach dem Verbindungsaufbau korrekt eingestellt hat. Und dass man dementsprechend kodierte Daten sendet.
Collations mit _ai am Ende gibt es auch nicht in MySQL.
dedlfix.
Hello,
Wenn deine Spalten bereits utf8_unicode_ci codiert angelegt sind (was gut ist!), dann brauchst/darfst Du keine zusätzliche COLLATE-Klausel mehr im Statement benutzen. Du musst aber dafür sorgen, dass der gesuchte Wert wirklich utf-8-kodiert ist.
Dazu muss man auch nichts im Statement ergänzen. Wenn man da was angeben muss, weil es sonst nicht funktioniert, hat man eher einen grundsätzlichen Fehler im System drin.
So meinte ich das auch nicht. Linuchs sollte nur ausprobieren, ob es mit dem Spalten-Präfix für die Umcodierung klappt. Den eingentlichen Fehler muss man dann separat eleminieren. :-)
Wichtig ist nur, dass man die Kodierung nach dem Verbindungsaufbau korrekt eingestellt hat. Und dass man dementsprechend kodierte Daten sendet.
Und damit man nicht jedes Mal neu darüber nachdenken muss, was man da alles einstellen muss, sollte man sich ja auch ein kleines Modul (oder Klasse) dafür schreiben, das man dann nur einbinden muss. Es muss ja nicht immer gleich ein fertiges Framework sein ;-O
Da bleibt bei mir die Frage offen, woher denn die Suchanfrage kam. Wenn die nämlich aus einer Fremdseite (Collaboration, Syndication) kam, könnte sie dort durchaus noch in iso-8859-1 o. ä. erzeugt worden sein, oder?
Liebe Grüße
Tom S.
Hallo Linuchs,
andersrum wird ein Schuh draus - Du musst gucken, welche Collations es gibt und die richtige auswählen. Beliebig zusammensetzen geht nicht.
Aber wie gesagt: eine Collation FooCollate_ci ist automatisch accent insensitive. Eine Collation, die case insensitive, aber accent sensitive ist, müsste FooCollate_ci_as heißen, und die gibt's gar nicht.
MySQL Handbuch sagt:
To list the available character sets and their default collations, use the SHOW CHARACTER SET statement or query the INFORMATION_SCHEMA CHARACTER_SETS table
utf8_general_ci oder utf8_unicode_ci (ohne das _ai) sollten funktionieren. Nimm aber eine Collation, die zum Encoding deiner DB passt. Wenn deine DB bspw. in latin1_general_cs codiert ist, solltest Du auch latin1_general_ci als CI-Kollation verwenden. Wenn du die Table schon mit einer _ci Collation angelegt hast, sollten deine Suchvorgänge - wie von anderen schon gesagt - bereits per Default accent insensitive sein.
Rolf