3 mysql indexing collation case-insensitive unique-key
我正在与整理斗争.我想构建一个对单词具有唯一索引的表,该表不区分大小写,但将"a"与"à"区分开来.这意味着"de"和"dé"应该是2个不同的条目,但de,De,DE,dE应该是相同的.
是否有一个utf8校对工作(似乎不是这样)?有没有办法说mysql不使用任何整理?还有其他解决方案吗?我不想把我的话改成小写或大写
谢谢
是否有一个utf8校对工作(似乎不是这样)?
MySQL附带的任何排序规则都不会这样做:utf8_*_ci
排序规则不会区分重音变化,utf8_bin
排序系统会区分字母组合.
有没有办法说mysql不使用任何整理?
文本比较总是需要整理(比较没有文本的文本是没有意义的); 为了避免完全使用排序规则,您必须将文本转换为二进制字符串(例如,使用BINARY
运算符),在这种情况下,字符串将通过其二进制编码进行比较.
但是,即使完全相同的字符以不同的方式编码,这也会导致差异(可能会发生!).因此,您应该使用utf8_bin
排序规则,其中字符通过其代码点进行比较(但如上所述,这将区分字母表).
有什么解决方案吗?我不想把我的话改成小写或大写
我建议使用UPPER()
或LOWER()
函数来更改表达式的大小写(注意基础数据保持不变),然后使用utf8_bin
排序规则进行比较.因此,不同的字母将是等价的,但所有其他差异(包括重音,但也包括收缩和扩展)都不会.例如:
SELECT col FROM my_table WHERE UPPER(col) LIKE UPPER('de') COLLATE utf8_bin
Run Code Online (Sandbox Code Playgroud)
在sqlfiddle上看到它.
或者,你可以添加你自己的排序规则,但是(除非你重新编译MySQL)你必须定义它相对于utf8_unicode_ci
哪个需要重置每个重音变化的重量 - 很多努力(尽管你可能会发现你可以从某人那里获得它)谁已经完成它,或者你可以以编程方式创建规则).