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