3

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

是否有一个 utf8 排序规则可以完成这项工作(似乎并非如此)?有没有办法对 mysql 说不使用任何排序规则?还有其他解决方案吗?我不想把我的话改成小写或大写

谢谢

4

1 回答 1

5
  1. 是否有一个 utf8 排序规则可以完成这项工作(似乎并非如此)?

    MySQL 附带的所有排序规则都不会这样做:utf8_*_ci排序规则不会区分重音变化,utf8_bin排序规则区分字母大小写。

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

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

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

  3. 有什么解决办法吗?我不想把我的话改成小写或大写

    我建议使用UPPER()orLOWER()函数来更改表达式的大小写(注意基础数据保持不变),然后使用utf8_bin排序规则进行比较。因此,不同的字母大小写将是等价的,但所有其他差异(包括重音,但也包括缩略语和扩展名)不会。例如:

    SELECT col FROM my_table WHERE UPPER(col) LIKE UPPER('de') COLLATE utf8_bin
    

    sqlfiddle上查看。

    或者,您可以添加自己的 collat​​ion,但是(除非您重新编译 MySQL)您必须相对于它来定义它,utf8_unicode_ci这将需要重置每个重音变化的权重 - 很多努力(尽管您可能会发现您可以从某人那里获得它谁已经完成了,或者您可以以编程方式创建规则)。

于 2012-05-22T14:30:59.653 回答