在mysql中可以使用重音敏感和不区分大小写的utf8排序规则吗?

时间:2011-09-30 09:44:32

标签: mysql utf-8 character-encoding collation

如何在mysql中执行重音敏感但不区分大小写的utf8搜索? Utf8_bin区分大小写,并且utf8_general_ci对重音不敏感。

3 个答案:

答案 0 :(得分:3)

如果你想将“café”与“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 Collat​​ion。

答案 1 :(得分:2)

似乎没有一个因为case sensitivity is tough to do in Unicode

有一个utf8_general_cs校对但似乎是实验性的,并且根据this bug report,它没有做到使用LIKE时的预期效果。

如果您的数据仅包含西方变音符号(即ISO-8859-1中包含的变音符号),您可以将搜索操作整理到latin1_german2_ci或用它创建单独的搜索列(根据{{​​3}},特定的排序规则是重音敏感的; latin1_general_ci可能也是如此,我不知道也无法立即测试。

答案 2 :(得分:1)

您可以使用“hex”来使搜索区分重音。然后简单地添加lcase以使其再次不区分大小写。这样就可以了:

SELECT name FROM people WHERE HEX(LCASE(name)) = HEX(LCASE("René"))

你会把所有索引抛出窗外。如果你想避免必须进行全表扫描并且你有一个“name”索引,那么在没有hex和lcase的情况下也搜索相同的东西:

SELECT name FROM people WHERE name = "René" and HEX(LCASE(name)) = HEX(LCASE("René"))

这样,“name”上的索引将用于仅查找行“René”和“Rene”,然后与“hex”需求进行比较仅在这两行而不是在整个表上完成。