MySQL通过“oe”,“ae”,“ue”找到变形金刚

时间:2016-07-28 12:19:30

标签: php mysql regex

我正在尝试构建MySQL搜索查询。 LIKE完全没问题,但是客户希望输入“oe”找到“ö”,“ae”找到“ä”,“ue”找到“ü”,因为它在德国很常见。
我将“oe”的每次出现替换为REGEXP后尝试使用(oe|ö),但REGEXP严格且不匹配(例如)“é”到“e”。
有没有办法使LIKE匹配“oe | ue | ae”或者我可能还有其他一些方法?
谢谢,
托马斯

2 个答案:

答案 0 :(得分:8)

Character Sets and Collations Supported by MySQL,我只能发现两个德国校对:

  • latin1_german1_ci
  • latin1_german2_ci

似乎latin1_german2_ci是您想要的,但它期望Latin1:

  

latin1_german2_ci(电话簿)规则:

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

如果你的表/列尚未使用它,你可以在查询本身强制进行这样的整理,例如:

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

如果您的应用程序使用Latin1,那么这应该可以解决问题。否则,我真的不知道:)

免责声明:我对德语一无所知。可能有另一种语言使用类似的规则。

答案 1 :(得分:0)

如果您使用的是utf8,则需要COLLATE utf8_german2_ci。请参阅collation chart(根据该图表,german2是唯一满足您需求的人。)

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

但是,将列声明为COLLATE utf8_german2_ci比在比较中使用该子句要高效得多。

(如果您使用的是utf8mb4,请相应更改拼写。)