我正在尝试构建MySQL搜索查询。 LIKE
完全没问题,但是客户希望输入“oe”找到“ö”,“ae”找到“ä”,“ue”找到“ü”,因为它在德国很常见。
我将“oe”的每次出现替换为REGEXP
后尝试使用(oe|ö)
,但REGEXP
严格且不匹配(例如)“é”到“e”。
有没有办法使LIKE
匹配“oe | ue | ae”或者我可能还有其他一些方法?
谢谢,
托马斯
答案 0 :(得分:8)
在Character Sets and Collations Supported by MySQL,我只能发现两个德国校对:
似乎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,请相应更改拼写。)