MySQL案例不敏感但强调敏感的UTF8唯一密钥

时间:2012-06-12 22:13:45

标签: mysql unicode utf-8 collation

我知道SF上有很多类似的问题,但我认为我的不同以保证一个新的问题。我有一个表,其中一个列为utf8,其中包含utf8_unicode_ci。它还在此列上具有唯一键以及标记语言代码的另一列。该列中的数据有许多不同的脚本(拉丁文有各种口音,中文和俄文等)。

问题在于,我有时会想要输入两个含有不同含义的单词,这些含义只有变音符号(即西班牙语anovsaño)才有所不同。由于utf8_unicode_ci是大小写和重音不敏感的,它认为这些是相同的,只允许我输入一个。太糟糕了。理想情况下,我只是将整个列切换到一些不敏感但非常敏感的排序规则,但这似乎不存在。很多不同的东西使用这个列,所以我宁愿不要将列的默认排序规则更改为utf8_bin,以免因为区分大小写而搞乱。

所以,所有这些说,我需要一些解决方案,不会影响到达到这一列的许多现有查询中的默认区分大小写,但是我会添加只有变音符号的单词。想法?如果必须的话,我会将唯一的键约束切换为utf8_bin,但我不想,因为我从不想要表中只有两种不同的东西。

2 个答案:

答案 0 :(得分:0)

我唯一能想到的(没有找到适合您需求的排序规则)就是在应用程序层(MySQL之外)改变一些可以区分差异的东西。

例如,由于您不关心大小写,因此您可以通过编程方式执行某些操作来降低数据库中所有行的大小写。然后将排序规则更改为utf8_bin。

然后,您可以在应用程序中将所有内容转换为小写,然后才能进入数据库(我猜这不会影响变音字符)。这样,如果人们试图输入多个案例,你仍然会遇到错误,你只需要改变几行代码来预处理进入表格的东西,你就不会有变音问题。

答案 1 :(得分:0)

你不必在这里重新发明爆胎(重新发明轮胎)。

MySQL中有两种西班牙语排序规则:

utf8_spanish_ci(现代西班牙语)和 utf8_spanish2_ci(繁体西班牙语)

他们非常了解语言,知道N和n应该整理在一起,但是ñ和ñ是N和O之间的不同字母。在西班牙语中,Ñ实际上是一个不同的字母,而不是重音。

将列排序规则设置为utf8_spanish_ci,并且所有列都将按照您想要的方式运行。