Announcement

Collapse
No announcement yet.

Probleme mit Umlauten in LIKE

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit Umlauten in LIKE

    Hallo,

    ich frage aus meiner MySQL-Datenbank Daten via LIKE ab.
    Der Vergleichswert stammt direkt (natürlich escaped) aus User-Input und es muss case-insensitive verglichen werden. LIKE ist aber case-sensitive.
    Also habe ich versucht:
    PHP Code:
    'LOWER(myfield) LIKE "'.strtolower($userinput).'"' 
    Das funktioniert prinzipiell gut, aber LOWER() scheint im Gegensatz zu strtolower() Umlaute nicht korrekt umzuwandeln.
    Alles geschieht in UTF-8. Wenn ich LOWER() und strtolower() weglasse dann werden auch Datensätze mit Umlauten gefunden (nur eben nicht case-insensitive).

    Weiß jemand eine elegante Lösung?

  • #2
    Du mußt den Nicht-UTF8 Wert deines Strings mit StrToLower "behandeln". Auch PHP arbeitet AFAIK in neueren Versionen mit Unicode als String-Datentyp und nicht als UTF8-Codierung.

    Comment


    • #3
      Ich bin nicht sicher, aber ich glaube die Unicode-Unterstützung von der du sprichst kommt erst mit PHP6.

      Ich habe noch ein bisschen rumprobiert und glaube jetzt, dass die Daten falsch codiert in der Datenbank liegen. Zumindest zeigt mir phpMA die Sonderzeichen falsch an (ö etc). Wenn die Datenbank versucht LOWER(ö) zu ermitteln, kommt logischerweise nicht das gewünschte Ergebnis dabei heraus.

      Die Daten stammen aus einer CSV-Datei die in windows-1252 codiert ist. Ich lasse beim Import durch ein PHP-Skript alle Daten folgendermaßen konvertieren:
      PHP Code:
      $utf8value iconv('windows-1252''UTF-8'$value); 
      Die Datenbankfelder haben die Kollation utf8_bin.

      Wo ist mein Fehler?

      Comment


      • #4
        Was sagt z.B. der MySQL Query Browser wenn du da auf die DB schaust. Schauen dort die Daten korrekt aus?

        Comment


        • #5
          Hallo,
          Originally posted by DaDyne View Post
          ...Die Datenbankfelder haben die Kollation utf8_bin.

          Wo ist mein Fehler?
          Hat die MySQL-Client-Verbindung auch UTF-8 als Encodierung? (Kannst du mit mysql_client_encoding() abfragen)

          Die übergabe an MySQL muss nämlich in der Encodierung der MySQL-Client-Verbindung erfolgen (diese muss nicht zwangsläufig mit der Kollation der DB(-Felder) übereinstimmen. Die korrekte Umkodierung von der Client-Verbindung zur DB-, Tabellen-, Feld-Kollation nimmt MySQl dann automatisch vor.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Diese Abfrage der Encodierung sollte ein vernünftiger DB-Treiber automatisch und transparent machen. Jedoch ob dies bei älteren PHP-Version der Fall ist?

            Comment


            • #7
              mysql_client_encoding() lieferte tatsächlich latin1.

              Beim Import der Werte aus der CSV habe ich jetzt folgende Umwandlung:
              PHP Code:
              utf8_decode(iconv('windows-1252''UTF-8'$value)) 
              Und beim Herausholen aus der DB muss ich alle Werte immer durch utf8_encode() schicken, dass sie auf meiner UTF8-Site ordentlich dargestellt werden.

              Scheint mir irgendwie ein wenig umständlich, aber jetzt läuft es - never touch a running system.

              Ich benutze mit PHP 5.2 zwar nicht die ganz neue, aber eine relativ aktuelle und wohl die gängigste PHP-Version.

              Vielen Dank für die Hilfe

              Comment


              • #8
                Hallo,

                du könntest natürlich auch einfach den Zeichensatz der Client-Verbindung auf UTF-8 setzen, dann wäre es einheitlich und du sparst die Umkodierungen.

                siehe: mysql_set_charset

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment

                Working...
                X