Daniel_t: MySQL - Umlaute - Suchen

Hallo,

ich hab eine Datenbank, mit einer Tabelle und einem Feld. Hier die Ausgabe:

+-------------+
| test        |
+-------------+
| essen       |
| Mahlzeit    |
| Mahlzeit    |
| österreich |
| Österreich |
| Österreich |
...

Wenn ich nun folgende Abfrage mach:

select * from testing where test like '%Öster%';

Findet er nur die Einträge mit großem "Ö", egal ob "ster" oder "STER" oder "sTeR" als rest da steht. Ich möchte nun, dass eine Suche mit kleinem Umlaut auch die großen findet und umgekehrt.

Im Netz hab ich oft den Hinweis gefunden, dass man bei einer DB mit Umlauten die Collation latin1/latin1_swedish_ci benutzen soll. Habs auch mit utf8/utf8_general_ci und einigen anderen versucht, aber komme nicht zum Ergebnis.

Kann mir da einer helfen? Verzweifel schon damit :)

Baba Daniel

  1. Hallo,

    Kann mir da einer helfen? Verzweifel schon damit :)

    Hi,

    vielleicht hilft die BINARY weiter:

    http://www.phphq.de/mysql.de/manual.de_617.html

    folglich:

      
    SELECT * FROM ... WHERE ... LIKE BINARY '...'  
    
    

    Grüße Matt

    1. Hi,

      vielleicht hilft die BINARY weiter:

      Mit Binary kann ich doch eben Casesensitive Abfragen machen, was genau das verkehrte ist, oder hab ich da was falsch verstanden:

      "Wenn Sie wollen, dass eine Spalte immer abhängig von der verwendeten Groß-/Kleinschreibung behandelt wird, deklarieren Sie sie als BINARY"

      Grüße Matt

      Baba Daniel

      1. Hm

        also wenn bei mir eine Tabelle durchsuche:

          
        SELECT *  
        FROM `projekte`  
        WHERE `papier` LIKE '%inhalt%'  
        LIMIT 0 , 30  
        
        

        dann findet er alle INHALT, Inhalt, iNHALT

        und das macht er bei dir nicht? Komische Sache...

          
        SELECT *  
        FROM `projekte`  
        WHERE `papier` LIKE Binary '%inhalt%'  
        LIMIT 0 , 30  
        
        

        dann liefert er mir nur alle mit "inhalt" zurück.
        Bei mir verhält sich alles völlig korrekt.

        Alle Kollationen utf8_general_ci
        Das durchsuchte Feld hat den Typ 'text'

        Grüße
        Matze

        1. Hm

          also wenn bei mir eine Tabelle durchsuche:

          WHERE papier LIKE '%inhalt%'

          dann findet er alle INHALT, Inhalt, iNHALT

          und das macht er bei dir nicht? Komische Sache...

          Oja, das funktioniert bei mir auch. Aber versuch das mal mit "inhält" bzw halt einem Umlaut im String. Da hab ich das Problem.

          Trag in die Tabelle ein: "inhält" und "inhÄlt" und such dann eines der beiden, da find ich immer nur eines.

          Grüße
          Matze

          Baba Daniel

          1. Moin!

            WHERE papier LIKE '%inhalt%'

            dann findet er alle INHALT, Inhalt, iNHALT

            und das macht er bei dir nicht? Komische Sache...

            Oja, das funktioniert bei mir auch. Aber versuch das mal mit "inhält" bzw halt einem Umlaut im String. Da hab ich das Problem.

            Trag in die Tabelle ein: "inhält" und "inhÄlt" und such dann eines der beiden, da find ich immer nur eines.

            Dann hast du die MySQL-Verbindung nicht auf UTF-8 eingestellt, aber dennoch UTF-8 Daten gesendet, die MySQL als Default (typisch ISO-8859-1) empfangen hat, und nach UTF-8 konvertiert ins Feld gespeichert hat.

            Resultat: Im Feld steht kein Umlaut, sondern die UTF-8-Form der ISO-8859-1-Darstellung des UTF-8-Umlauts. Und der kann natürlich nicht korrekt in die Case-Insensitive-Betrachtung einfließen, und daher werden nur bei korrekter Übereinstimmung der Großschreibung Funde gemeldet.

            "SET NAMES utf8" als erster Query sollte Pflichtbestandteil jedes vernünftigen Verbindungsaufbaus zur Datenbank sein.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Moin!

              "SET NAMES utf8" als erster Query sollte Pflichtbestandteil jedes vernünftigen Verbindungsaufbaus zur Datenbank sein.

              Da war mein Fehler, danke!

              Bei "jeder" Verbindung und die DB mit der richtigen Collation angelegt, dann passts.

              • Sven Rautenberg

              Vielen Dank an alle!

              Baba Daniel

              1. echo $begrüßung;

                Bei "jeder" Verbindung [SET NAMES ...] und die DB mit der richtigen Collation angelegt, dann passts.

                Die Kollation/Kodierung der Datenbank oder auch der Tabelle ist letzlich unbedeutend. Es kommt immer darauf an, welche Kodierung/Kollation für jedes einzelne Feld eingestellt ist. Die Datenbank- und Tabellenangaben sind nur Default-Werte, die verwendet werden, wenn für das Feld keine explizite Angabe gemacht wurde.

                Für die Kommunikation mit dem Client ist außerdem allein die Kodierung der aktuellen Verbindung interessant. Wenn diese nicht mit der Feldkodierung übereinstimmt, nimmt MySQL selbständig eine Umkodierung vor. Da dies nicht von jeder Kodierung in jede andere Kodierung verlustfrei möglich ist, ist man gut beraten, für die gesamte Verarbeitungskette eine Kodierung zu verwenden, die alle benötigten Zeichen repräsentieren kann.

                echo "$verabschiedung $name";

  2. Im Netz hab ich oft den Hinweis gefunden, dass man bei einer DB mit Umlauten die Collation latin1/latin1_swedish_ci benutzen soll. Habs auch mit utf8/utf8_general_ci und einigen anderen versucht, aber komme nicht zum Ergebnis.

    der zeichensatz selbst soltle latin1 bzw utf8 sein

    die zeichensortierung bei einem deutschen/österreichischen text auf swedisch_ci stellen ist dämlich - hier würde german_ci oder general_ci empfehlen

    utf8_general_ci findet ein Ö bei der suche nach ö oder Ö

    bei latin1_swedish_ci ist zb Ü, ü, Y und y identisch - das ist in deinem fall sicher schlecht

    bin/binary wurde ich ebenfalls nicht nehmen, da hier ein exakter binärvergleich durchgeführt wird

    wichtig ist aber auch die verbindung zur datenbank

    wenn die datenbank in utf8 codiert ist und da drinne Ö steht und du dann nach Ö suchst, die verbindung/übertragung in ANSI erfolgt, kommt in der db dann halt Ö anstatt Ö an, somit findest du nix

    1. Also ich hab das nun direkt nochmal versucht:

      create database testing3 default character set 'utf8' default collate 'utf8_general_ci'

      Dann ne table erstellt, 2 Datensätze eingefügt, und das selbe wie vorher.

      Mit einem select * zeigt es mir beide Datensätze ohne Fehler an.

      baba Daniel

      1. echo $begrüßung;

        create database testing3 default character set 'utf8' default collate 'utf8_general_ci'
        Dann ne table erstellt, 2 Datensätze eingefügt, und das selbe wie vorher.

        Das Problem kann ich mit dem phpMyAdmin nicht nachvollziehen. Zwei Datensätze, einer mit "Österreich", einer mit "köstlich", eingefügt und mit LIKE "%öst%" und auch großem Ö werden beide Datensätze gefunden. Ich vermute dein Problem an anderer Stelle. Welche Kodierung verwendest du auf der Verbindung deines Clients mit dem Server? Stellst du die explizit auf einen definierten Wert und sendest dementsprechend kodierte Daten?

        echo "$verabschiedung $name";

      2. Mit einem select * zeigt es mir beide Datensätze ohne Fehler an.

        wie gesagt, das hilft nichts wenn die VERBINDUNG zur datenbank falsch codierd wird

        mysql kann mehr als nur eine datenbank mit einem zeichensatz erzeugen - wie gesagt die verbindung selbst ist entscheidend - wenn du ein utf-8 zeichen durch eine ansi-verbindung jagst, geht das ding defintiv verloren bzw kommt nicht so an wie gewolt = kein ergebnis

  3. Hallo

    ich hab eine Datenbank, mit einer Tabelle und einem Feld. Hier die Ausgabe:

    +-------------+
    | test        |
    +-------------+
    | essen       |
    | Mahlzeit    |
    | Mahlzeit    |
    | österreich |
    | Österreich |
    | Österreich |
    ...

    Wenn ich nun folgende Abfrage mach:

    select * from testing where test like '%Öster%';

    Findet er nur die Einträge mit großem "Ö", egal ob "ster" oder "STER" oder "sTeR" als rest da steht. Ich möchte nun, dass eine Suche mit kleinem Umlaut auch die großen findet und umgekehrt.

    ich verwende inzwischen grundsätzlich UTF-8 als Default charset und kann Dein Problem nicht nachvollziehen.

    Freundliche Grüße

    Vinzenz