【发布时间】:2011-11-28 08:19:15
【问题描述】:
如何在 mysql 中执行区分重音但不区分大小写的 utf8 搜索? utf8_bin 区分大小写,utf8_general_ci 不区分重音。
【问题讨论】:
-
不是今天...但是,如果您想折叠大小写,但需要区分重音,请通过bugs.mysql.com 提出请求。
标签: mysql utf-8 character-encoding collation
如何在 mysql 中执行区分重音但不区分大小写的 utf8 搜索? utf8_bin 区分大小写,utf8_general_ci 不区分重音。
【问题讨论】:
标签: mysql utf-8 character-encoding collation
如果您想将“cafe”与“cafe”区分开来 您可以使用:
Select word from table_words WHERE Hex(word) LIKE Hex("café");
这样它会返回 'café'。
否则,如果您使用:
Select word from table_words WHERE Hex(word) LIKE Hex("cafe");
它将返回咖啡馆。 我正在使用 latin1_german2_ci 排序规则。
【讨论】:
似乎没有,因为case sensitivity is tough to do in Unicode。
有一个utf8_general_cs 排序规则,但它似乎是实验性的,并且根据this bug report 的说法,在使用 LIKE 时并没有达到预期的效果。
如果您的数据仅包含西方变音符号(即 ISO-8859-1 中包含的变音符号),您也许可以将您的搜索操作整理到 latin1_german2_ci 或使用它创建一个单独的搜索列(特定于根据this page,排序规则对重音敏感;latin1_general_ci 可能也是如此,我不知道,现在无法测试)。
【讨论】:
您可以使用“hex”使搜索区分重音。然后只需添加 lcase 使其再次不区分大小写。所以这会给:
SELECT name FROM people WHERE HEX(LCASE(name)) = HEX(LCASE("René"))
您确实会像这样将所有索引都扔出窗口。如果您想避免进行全表扫描并且您在“名称”上有索引,也可以搜索不带十六进制和 lcase 的相同内容:
SELECT name FROM people WHERE name = "René" and HEX(LCASE(name)) = HEX(LCASE("René"))
这样,“name”上的索引将用于仅查找“René”和“Rene”行,然后只需对这些行进行与“hex”的比较两行而不是完整的表。
【讨论】: