如何使用重音创建一个Mysql唯一不区分大小写的索引 - (或使用NO collat​​ion)

时间:2012-05-22 09:49:53

标签: mysql indexing collation case-insensitive unique-key

我正在与整理作斗争。 我想构建一个对单词具有唯一索引的表,该表不区分大小写,但将“a”与“à”区分开来。 这意味着“de”和“dé”应该是2个不同的条目,但de,De,DE,dE应该是相同的。

是否有一个utf8校对工作(似乎不是这样)? 有没有办法说mysql不使用任何整理? 还有其他解决方案吗?我不想把我的话改成小写或大写

感谢

1 个答案:

答案 0 :(得分:5)

  1.   

    是否有utf8校对工作(似乎不是这样)?

    MySQL附带的任何排序规则都不会执行此操作:utf8_*_ci排序规则不会区分重音变化和utf8_bin归类区分字母。

  2.   

    有没有办法说mysql不使用任何排序规则?

    文本比较总是需要整理(比较没有文本的文本是没有意义的);为了避免完全使用排序规则,您必须将文本转换为二进制字符串(例如,使用BINARY运算符),在这种情况下,字符串将通过其二进制编码进行比较。

    然而,即使完全相同的字符以不同的方式编码(这可能发生!),这也会导致差异。因此,您应该使用utf8_bin排序规则,其中字符按其代码点进行比较(但如上所述,此区分字母)。

  3.   

    有什么解决方案吗?我不想把我的话改成小写或大写

    我建议使用UPPER()LOWER()函数更改表达式的大小写(请注意基础数据保持不变),然后使用{{1}整理以执行比较。因此,不同的字母将是等价的,但所有其他差异(包括重音,但也包括收缩和扩展)不会。例如:

    utf8_bin

    sqlfiddle上查看。

    或者,你可以add your own collation,但是(除非你重新编译MySQL)你必须相对于SELECT col FROM my_table WHERE UPPER(col) LIKE UPPER('de') COLLATE utf8_bin 定义它,这将需要重置每个重音变化的重量 - 很多努力(虽然你可能会发现你可以从已经完成它的人那里获得它,或者你可以以编程方式创建规则。)