2016-07-28 6 views
5

Ich versuche eine MySQL Suchabfrage zu erstellen. LIKE wäre völlig in Ordnung, aber der Kunde will Eingaben mit "oe" finden "ö", "ae" finden "ä" und "ue" finden "ü", wie es in Deutschland recht üblich ist.
Ich versuchte, REGEXP nach dem Ersetzen jedes Auftretens von "oe" zu (oe|ö) zu verwenden, aber REGEXP ist streng und stimmt nicht überein (zum Beispiel) "é" zu "e".
Gibt es eine Möglichkeit LIKE mit "oe | ue | ae" abzugleichen oder eine andere Möglichkeit, die ich nicht habe?
Danke,
thomasMySQL finde umlaute von "oe", "ae", "ue"

+2

Wow, das war schnell. Downvoted bevor ich fertig war ... :( – thomas

+0

Wahrscheinlich erwägen Sie, in eine Suchmaschine wie Solr zu investieren. – apokryfos

+0

Tipp: set utf8_general in mysql dann 'e' findet' è' http://stackoverflow.com/questions/2344118/utf -8-general-bin-unicode – JustOnUnderMillions

Antwort

8

Bei Character Sets and Collations Supported by MySQL kann ich nur zwei deutsche Sortierungen vor Ort:

  • latin1_german1_ci
  • latin1_german2_ci

Es scheint, dass latin1_german2_ci derjenige ist, die Sie wollen, es aber erwartet Latin1:

latin1_german2_ci (Telefonbuch) Regeln:

  • Ä = AE
  • Ö = OE
  • Ü = UE
  • ß = ss

Wenn Ihre Tabelle/Spalte verwendet es nicht bereits, Sie können eine solche Sortierung in der Abfrage selbst erzwingen, zB:

mysql> SELECT _latin1'oe' collate latin1_german2_ci ='ö' AS are_equal; 
+-----------+ 
| are_equal | 
+-----------+ 
|   1 | 
+-----------+ 
1 row in set (0.00 sec) 

Wenn Ihre Anwendung Latin1 verwendet, sollte dies den Trick tun. Ansonsten habe ich ehrlich gesagt keine Ahnung :)

Disclaimer: Ich weiß nichts über Deutsch. Möglicherweise gibt es eine andere Sprache, die ähnliche Regeln verwendet.

+1

Danke! Das ist wirklich hilfreich.Leider verwendet unsere Anwendung UTF8 ... – thomas

+0

@thomas Wenn Sie die Möglichkeit haben, dies auf UTF-8 zu testen, teilen Sie uns Ihre Erfahrungen mit. Wie gesagt, ich weiß nicht wirklich, dass MySQL gemischte Codierungen verarbeitet. –

+1

Ich bekomme einen Fehler "illegale Mischung von Sortierungen". Wie Sie gesagt haben, erwartet latin_german2_ci latin1 Zeichen. – thomas

0

Wenn Sie utf8 verwenden, ist COLLATE utf8_german2_ci erforderlich. Siehe collation chart (Und nach diesem Diagramm, german2 die einzige ist, Ihre Bedürfnisse zu befriedigen.)

mysql> SELECT "oe" = "ö" COLLATE utf8_german2_ci; 
+-------------------------------------+ 
| "oe" = "ö" COLLATE utf8_german2_ci | 
+-------------------------------------+ 
|         1 | 
+-------------------------------------+ 

Es ist jedoch wesentlich effizienter ist die Spalte (n) zu erklären COLLATE utf8_german2_ci zu sein, als diese Klausel zu verwenden, in Vergleichen.

(Wenn Sie utf8mb4 verwenden, ändern Sie die Schreibweise entsprechend.)

Verwandte Themen