我正在与整理作斗争。 我想构建一个对单词具有唯一索引的表,该表不区分大小写,但将“a”与“à”区分开来。 这意味着“de”和“dé”应该是2个不同的条目,但de,De,DE,dE应该是相同的。
是否有一个utf8校对工作(似乎不是这样)? 有没有办法说mysql不使用任何整理? 还有其他解决方案吗?我不想把我的话改成小写或大写
感谢
答案 0 :(得分:5)
是否有utf8校对工作(似乎不是这样)?
MySQL附带的任何排序规则都不会执行此操作:utf8_*_ci
排序规则不会区分重音变化和utf8_bin
归类将区分字母。
有没有办法说mysql不使用任何排序规则?
文本比较总是需要整理(比较没有文本的文本是没有意义的);为了避免完全使用排序规则,您必须将文本转换为二进制字符串(例如,使用BINARY
运算符),在这种情况下,字符串将通过其二进制编码进行比较。
然而,即使完全相同的字符以不同的方式编码(这可能发生!),这也会导致差异。因此,您应该使用utf8_bin
排序规则,其中字符按其代码点进行比较(但如上所述,此将区分字母)。
有什么解决方案吗?我不想把我的话改成小写或大写
我建议使用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
定义它,这将需要重置每个重音变化的重量 - 很多努力(虽然你可能会发现你可以从已经完成它的人那里获得它,或者你可以以编程方式创建规则。)