2016-07-28 38 views
5

我試圖建立一個MySQL搜索查詢。 LIKE會很好,但客戶希望用「oe」找到「ö」,「ae」找到「ä」和「ue」找到「ü」,因爲這在德國很常見。
我試着用REGEXP代替每個「oe」出現在(oe|ö)之後,但REGEXP是嚴格的並且不符合(例如)「é」到「e」。
有沒有辦法讓LIKE匹配「oe | ue | ae」或者其他一些我沒有的方式?
謝謝,
托馬斯MySQL找到umlaute by「oe」,「ae」,「ue」

+2

哇,這很快。在我完成之前降低投票... :( – thomas

+0

可能考慮投資於像Solr這樣的搜索引擎。 – apokryfos

+0

提示:在mysql中設置utf8_general,然後'e'將會找到'è'http://stackoverflow.com/questions/2344118/utf -8-general-bin-unicode – JustOnUnderMillions

回答

8

Character Sets and Collations Supported by MySQL我只能發現兩名德國歸類:

  • latin1_german1_ci
  • latin1_german2_ci

看來latin1_german2_ci是你想要的,但它期望拉丁文1:

latin1_german2_ci(電話簿)規則:

  • △= AE
  • O = OE
  • U = UE
  • SS = SS

如果您的表/列還沒有使用它,你可以在查詢本身中強制這種排序規則,例如:

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

如果您的應用程序正在使用Latin1,這應該可以做到。否則,我真的不知道:)

聲明:我對德語一無所知。可能有另一種語言使用類似的規則。

+1

謝謝!這真的很有幫助。不幸的是,我們的應用程序使用UTF8 ... – thomas

+0

@thomas如果您有機會使用UTF-8進行測試,請分享您的體驗。正如我所說的,我並不知道MySQL處理混合編碼。 –

+1

我收到「非法混用的排序規則」錯誤。正如你所說,latin_german2_ci期望latin1字符。 – thomas

0

如果您使用utf8,COLLATE utf8_german2_ci是必需的。見collation chart(而且,根據該圖表,german2是滿足您的需求,唯一的一個。)

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

然而,這是更有效的申報列(S)爲COLLATE utf8_german2_ci,而不是使用條款在比較中。

(如果您使用的是utf8mb4,請相應地更改拼寫。)