操作员行为
等号运算符=
如果您使用等号运算符=
进行精确搜索,则解决方案@rsanchez
是正确的。例如,找到等于的行œ
可以使用这个精确值œ
或其音译值来完成oe
:
SELECT 'œ' = 'oe' COLLATE utf8_unicode_ci ;
-- true
+-------------------------------------+
| 'œ' = 'oe' COLLATE utf8_unicode_ci |
+-------------------------------------+
| 1 |
+-------------------------------------+
将返回等于œ
或oe
如果用户使用其中任何一个的行。
LIKE
操作员
但是,如果您想使用LIKE
operator进行模糊搜索,这是行不通的。例如,œ
通过键入oe
搜索包含的单词将不会返回带有œ
.
SELECT 'œ' LIKE 'oe' COLLATE utf8_unicode_ci ;
-- false
+----------------------------------------+
| 'œ' LIKE 'oe' COLLATE utf8_unicode_ci |
+----------------------------------------+
| 0 |
+----------------------------------------+
解释 ?
这不是错误,而是SQL 标准的预期行为(参见 Alexander Barkov 的回答),就像在使用更复杂的方法(例如,允许音译相等)LIKE
时基于字符进行比较一样。=
解决方案
提供音译形式
一种解决方案是生成搜索的音译并修改查询以搜索每种形式:
SELECT * FROM `mytable`
WHERE `myfield` LIKE 'oe' or `myfield` LIKE 'oe'
COLLATE utf8_unicode_ci;
使用全文搜索
从MySQL 5.6 开始,全文搜索现在可用于 InnoDB(以前它仅可用于MyISAM
表)。