wake-up-neo.com

So führen Sie eine Accent Sensitive-Suche in MySql durch

Ich habe eine MySQL-Tabelle mit utf8 allgemeiner ci-Kollatierung. In der Tabelle sehe ich zwei Einträge:

ein schlechter
ein schlechter

Ich verwende eine Abfrage, die folgendermaßen aussieht:

SELECT *  FROM `words` WHERE `Word` = 'abád'

Das Abfrageergebnis liefert beide Wörter:

ein schlechter
ein schlechter

Gibt es eine Möglichkeit zu zeigen, dass MySQL nur das Wort mit Akzent finden soll? Ich möchte, dass die Abfrage nur zurückgegeben wird 

ein schlechter 

Ich habe diese Abfrage auch ausprobiert:

SELECT *  FROM `words` WHERE BINARY `Word` = 'abád'

Es gibt mir keine Ergebnisse. Danke für die Hilfe.

57
Chris

Wenn Ihre Suchen in diesem Feld immer akzentabhängig sind, deklarieren Sie die Kollatierung des Felds als utf8_bin (damit werden die utf8-codierten Bytes gleichgestellt), oder verwenden Sie eine sprachspezifische Kollatierung, die zwischen Akzent und Un unterscheidet Zeichen mit Akzent 

col_name varchar(10) collate utf8_bin

Wenn die Suche in der Regel auf Akzente verzichtet, Sie jedoch eine Ausnahme für diese Suche festlegen möchten, versuchen Sie es;

WHERE col_name = 'abád' collate utf8_bin
81
user8599

In meiner Version (MySql 5.0) ist kein utf8-Zeichensatz für die Suche nach Groß- und Kleinschreibung verfügbar. Die einzige akzentempfindliche Sortierung für utf8 ist utf8_bin. Es ist jedoch auch case sensitive.

Meine Arbeit bestand darin, so etwas zu verwenden:

SELECT * FROM `words` WHERE LOWER(column) = LOWER('aBád') COLLATE utf8_bin
11
David

Der MySQL-Fehler zum Nachschlagen ist http://bugs.mysql.com/bug.php?id=19567 .

3
colan

Ich habe den gleichen Fehler bekommen.

Ich habe die Kollatierung meiner Tabelle in utf8_bin (über phpMyAdmin) geändert und das Problem wurde behoben.

Ich hoffe es hilft! :)

1
Silvio Delgado

Prüfen Sie, ob der Sortierungstyp der Datenbanktabelle mit "_ci" endet. Dies steht für Groß- und Kleinschreibung.

Ändern Sie es in die Sortierung desselben oder des nächstgelegenen Namens ohne "_ci" ...

Zum Beispiel ... ändern Sie "utf8_general_ci" in "utf8_bin" Mke

1
Mike

Die akzeptierte Antwort ist gut, aber beachten Sie, dass Sie stattdessen COLLATE utf8mb4_bin verwenden müssen!

WHERE col_name = 'abád' collate utf8mb4_bin

Behebt Fehler wie:

MySQL sagte: Dokumentation 1253 - COLLATION 'utf8_bin' ist nicht gültig für Zeichensatz 'utf8mb4'

0
Robert Sinclair

Nun, Sie haben gerade beschrieben, worum es sich bei utf8_general_ci-Kollatierung handelt (a, á, à, â, ä, å ... å, alles gleich einem im Vergleich).

In MySQL-Server 5.1 wurden auch Änderungen in Bezug auf utf8_general_ci und utf8_unicode_ci vorgenommen, sodass die Serverversion davon abhängig ist. Überprüfen Sie besser die Dokumente.

Wenn es sich um MySQL Server 5.0 handelt, würde ich utf8_unicode_ci anstelle von utf8_general_ci wählen, was für Ihren Anwendungsfall offensichtlich falsch ist.

0
Tonci Grgin
SELECT *  FROM `words` WHERE column = 'abád' collate latin1_General_CS 

(oder Ihre Kollatierung einschließlich cs)

0
cjk

Sie können versuchen, nach der Hex-Variablen des Zeichens HEX () in mysql zu suchen und eine ähnliche Funktion in Ihrer Programmiersprache zu verwenden und diese abzugleichen. Dies funktionierte gut für mich, als ich eine Auflistung machte, in der eine Person den ersten Buchstaben einer Person auswählen konnte.

0
Ólafur Waage

Das funktioniert für mich für eine Akzent- und Groß-/Kleinschreibung in MySQL-Server 5.1 in einer Datenbank in utf8_general_ci, wobei Spalte ein LONGBLOB ist.

select * from words where '%Word%' LIKE column collate utf8_unicode_ci

mit 

select * from words where'%Word%' LIKE column collate utf8_general_ci

das Ergebnis ist Groß- und Kleinschreibung, jedoch nicht akzentempfindlich.

0