Linuchs: mySQL: Nach e suchen, und auch é finden

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

  1. 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?

    collation

  2. Hallo Linuchs,

    Guck hier und hier.

    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

    --
    Dosen sind silbern
    1. 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

      1. 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.

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
        1. 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.

          1. 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.

            --
            Es gibt nichts Gutes, außer man tut es
            Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
      2. 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

        --
        Josen sind $$C_{20}H_{34}$$