ms: MYSQL Like Umlaute

Hi,
bin gerade am verzweifeln.
Ich verwende php/mysqli um auf meine mysql DB zuzugreifen.

Ich hab jetzt sowohl set_charset("utf8") über mysqli als auch manuell mit SET NAMES 'utf8' gesetzt.

Trotzdem gibt mir zb select ..... LIKE '%äasdf' das gleiche zurück wie %aasdf sprich er behandelt:
 ö=o, ü=u, ä=a

Hab nichts passendes gefunden gibt aber mehrere mit dem Problem. einige sind auf iso umgestiegen, ich hab jedoch überall utf8 bzw utf8_unicode_ci und möchte nicht alles ändern..

jemand eine idee wie ich das matchen könnt und die umlaute in der db stehen lassen kann?

  1. Hi!

    bin gerade am verzweifeln.

    Das löst das Problem auch nicht.

    Ich hab jetzt sowohl set_charset("utf8") über mysqli als auch manuell mit SET NAMES 'utf8' gesetzt.

    Eins reicht. Beides zusammen bringt auch keine Verbesserung.

    Trotzdem gibt mir zb select ..... LIKE '%äasdf' das gleiche zurück wie %aasdf sprich er behandelt:
    ö=o, ü=u, ä=a

    Ja, das liegt an der eingestellten Kollation.

    Hab nichts passendes gefunden gibt aber mehrere mit dem Problem.

    Das MySQL-Handbuch hat ein Kapitel Globalization, da steht alles Wissenswertes zu MySQLs Umgang mit Zeichen drin. Dein konkretes Problem ist ein "works as designed".

    einige sind auf iso umgestiegen, ich hab jedoch überall utf8 bzw utf8_unicode_ci und möchte nicht alles ändern..

    Auf Latin1 umzusteigen löst das Problem nicht. Stattdessen gehen dir zusätzlich die Möglichkeiten von UTF-8 verloren.

    jemand eine idee wie ich das matchen könnt und die umlaute in der db stehen lassen kann?

    Wenn es sich um ein Passwortfeld oder etwas ähnliches handelt, in dem generell keine sprachlichen Besonderheiten und Groß-/Kleinschreibung berücksichtigt werden sollen, dann nimm utf8_bin als Kollationsangabe. Wenn du nur temporär dieselben Auswirkungen haben möchtest, nimm das Schlüsselwort BINARY.

    Lo!

    1. Hi,
      danke dir habs mit
      WHERE LCASE(attribute) LIKE BINARY ? > 0

      bind_param("s", strtolower...

      gemacht geht super ;)

    2. Auf Latin1 umzusteigen löst das Problem nicht. Stattdessen gehen dir zusätzlich die Möglichkeiten von UTF-8 verloren.

      ...während Dir die (wenn auch wenigen) Möglichkeiten von Latin1 erhalten bleiben. Ich bin wieder vonm UTF-8 auf latin1 zurück und ziemlich happy damit.

      Gruß, Torro

      1. Hi!

        Auf Latin1 umzusteigen löst das Problem nicht. Stattdessen gehen dir zusätzlich die Möglichkeiten von UTF-8 verloren.
        ...während Dir die (wenn auch wenigen) Möglichkeiten von Latin1 erhalten bleiben. Ich bin wieder vonm UTF-8 auf latin1 zurück und ziemlich happy damit.

        Latin1 ist nicht _die_ Lösung. Damit hat man genau dieselben Probleme wie mit jeder anderen Kodierung. Wenn zwei Partner etwas unterschiedliches sprechen, verstehen sie sich nicht. Latin1 ist nur historisch bedingt oftmals die Voreinstellung, weswegen die Wahrscheinlichkeit höher ist, dass mit Latin1/ISO-8859-1 zufälligerweise alles funktioniert, auch wenn man sich nicht um Konfigurationseinstellungen und Kodierungsaushandlungen kümmert. Gibt man hingegen explizit an den relevanten Stellen die verwendete Kodierung bekannt und hält sich auch dran, ist jede andere Kodierung genausogut verwendbar (wenn sie alle zu verwendenden Zeichen abbilden kann).

        Lo!