如何在mysql中执行重音敏感但不区分大小写的utf8搜索? Utf8_bin区分大小写,并且utf8_general_ci对重音不敏感。
答案 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 Collation。
答案 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
”需求进行比较仅在这两行而不是在整个表上完成。