utf-8: Suche ä, findet a

Alles, was MariaDB und MySQL betrifft, kann hier besprochen werden.

utf-8: Suche ä, findet a

Postby Xendiadyon » 03. April 2008 10:17

Hallo,
ich habe meine Datenbank und Webseite komplett auf utf8 umgestellt. Wenn ich nach total kryptischen Sonderzeichen wie « oder … suche, finde ich auch alles.

Aber wenn ich nach den Umlauten "ä, ö und ü" suche, dann wirft der mir alle Ergebnisse mit "a, o und u" aus. Sowohl auf meiner Webseite als auch über phpmyAdmin.
(Bei der Suche nach ß findet er aber auch nur Sprüche mit ß, genau wie es sein soll)

Wer kann mir helfen? Woran liegt das?


Zu utf-8:
- Zeichencodierung der Dateien: utf-8
- header("Content-type: text/html; charset=utf-8");
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
- MySQL: SET NAMES utf8;
- ich verwende multibyte-Funktionen

SHOW VARIABLES LIKE "char%":
Code: Select all
character_set_client     utf8
character_set_connection    utf8
character_set_database    latin1 (lokal: utf8)
character_set_filesystem    binary
character_set_results    utf8
character_set_server    latin1
character_set_system    utf8
character_sets_dir    /usr/share/mysql/charsets/


Ich habe die MySQL-Versionen 5.0.32 (auf dem Server) und 5.0.51 (lokal)

Liebe Grüße,
Christian
Xendiadyon
 
Posts: 4
Joined: 03. April 2008 10:02

Postby Wiedmann » 03. April 2008 11:45

Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Xendiadyon » 03. April 2008 12:20

Dankeschön.
Ich bin am Überlegen, ob ich nun als Collation utf8_swedish_ci oder latin1_german2_ci nehmen kann und die Datenbank und alles trotzdem auf utf8 lasse. Mache ich mir da etwas kaputt? (bei Konvertierung zu latin1_german2_ci verliere ich offenbar ein paar Zeichen)

Oder kann man das gefahrlos so machen, bis eine ordentliche deutsche Sortierreihenfolge "auf den Markt gebracht" wird?
Xendiadyon
 
Posts: 4
Joined: 03. April 2008 10:02

Postby Wiedmann » 03. April 2008 12:42

bis eine ordentliche deutsche Sortierreihenfolge "auf den Markt gebracht" wird?

Du meinst, wie du es gerne sortiert haben möchtest.... MySQL sortiert genau nach der deutschen DIN Norm.

Du könntst aber z.B. beim LIKE noch ein "COLLATE utf8_bin" dranhängen, oder du vergleichst mit "=".
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Xendiadyon » 03. April 2008 12:51

Ja, aber die deutschen latin-Zeichensätze sind doch auch nach einer DIN sortiert, oder? Und die scheint mir persönlich etwas sinnvoller zu sein, dass die Umlaute nicht mit den Vokalen gleichgesetzt werden.

Wenn ich mit = vergleiche, dann muss ich doch die gesamte Zeichenkette vergleichen. Wenn ich nach Zeichen innerhalb eines Spruches suchen will, ist das in der Art unmöglich, oder?

Und bei "COLLATE utf8_bin" wäre das alles nicht case-insensitive, wenn ich das richtig verstanden habe?

Oder gibt es da Möglichkeiten, das zu umgehen (ohne gleich alles LOWER()n zu müssen?)


Danke, dass du mir deine Zeit widmest. Ich bin gestern fast ausgeflippt, weil ich nichts darüber gefunden habe (ich habe wohl irgendwie falsch gesucht...)
Xendiadyon
 
Posts: 4
Joined: 03. April 2008 10:02

Postby Wiedmann » 03. April 2008 13:13

a, aber die deutschen latin-Zeichensätze sind doch auch nach einer DIN sortiert, oder?

Nun ja, utf8-general-ci machst genauso wie latin1_german1_ci (DIN 5007 Variante 1 - Lexikonsortierung).

Du hattest bisher wohl (wie auf vielen Servern voreingestellt) latin1-swedish-ci oder latin1-general-ci. Beides ist halt nicht wirklich eine deutsche Sortierung.

Und bei "COLLATE utf8_bin" wäre das alles nicht case-insensitive,

Nein, bei _bin wird der Zeichencode (ähnlich ASCII-Code) verglichen, und da hat jedes Zeichen einen eigenen Code (wäre also sozusagen case-sensitive).
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Xendiadyon » 03. April 2008 13:36

Ich habe jetzt deinen Tipp mit COLLATE "utf8_bin" aufgegriffen, das ist einfach vernünftiger als so ne Pfuscherei:

Ich habe das jetzt so gemacht, dass ich als Standardkollation "utf8_unicode_ci" verwende. Das bedeutet, standardmäßig sind ä und a gleich. (insbesondere beim Sortieren wichtig!)

Wenn ich jetzt aber suche, stelle ich für die Abfrage die Kollation durch COLLATE "utf8_bin" auf Binär um. Damit trotzdem nicht zwischen Groß- und Kleinschreibung unterschieden wird, setze ich vor die entsprechenden Vergleichsfelder ein LOWER():
Code: Select all
...  AND LOWER(sa_spruch.spruch) LIKE LOWER("%'.mres($query).'%") COLLATE "utf8_bin" ...



Ziemlich umständlich, aber jetzt sortiert es ordentlich und findet auch wirklich nur die Zeichen, die ich will! Und ich kann bei Bedarf relativ einfach einen switch zum case-sensitiven-Suchen einbauen.
Danke!
Xendiadyon
 
Posts: 4
Joined: 03. April 2008 10:02


Return to MariaDB - MySQL

Who is online

Users browsing this forum: No registered users and 12 guests