【问题标题】:MySQL Case Insensitive but Accent Sensitive UTF8 Unique KeyMySQL 不区分大小写但区分重音的 UTF8 唯一键
【发布时间】:2012-06-15 20:46:48
【问题描述】:

我知道在 SF 上有很多类似的问题,但我认为我的问题足够不同,需要提出一个新问题。我有一个表,它有一个带有 utf8_unicode_ci 的 utf8 列。它在此列上还有一个唯一键以及另一个标记语言代码的列。列中的数据有许多不同的文字(带有各种口音的拉丁文、中文和俄文等)。

问题是我有时会想输入两个含义不同的单词,它们的区别仅在于变音符号(即西班牙语 ano 与 año)。由于 utf8_unicode_ci 不区分大小写和重音,它认为它们是相同的,只会让我输入一个。太糟糕了。理想情况下,我只需将整个列切换到不区分大小写但区分重音的排序规则,但这似乎不存在。很多不同的东西都使用这个列,所以我宁愿不要将列的默认排序规则更改为 utf8_bin ,以免混淆大小写。

所以,综上所述,我需要一些解决方案,该解决方案不会影响命中此列的许多现有查询中的默认大小写敏感度,但可以让我添加仅相差一个变音符号的单词。想法?如果必须,我会将唯一键约束切换为 utf8_bin,但我不想这样做,因为我从不希望表中有两个仅因大小写而异的东西。

【问题讨论】:

    标签: mysql unicode utf-8 collation


    【解决方案1】:

    我唯一能想到的(没有找到适合您需要的排序规则)是在应用层(MySQL 之外)进行更改以处理差异化。

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

    然后,您可以在应用程序中将所有内容在进入数据库之前转换为小写(我猜这不会影响变音符号)。这样,如果人们尝试输入多个案例,您仍然会出错,您只需更改几行代码即可对进入表格的内容进行预处理,并且您不会遇到变音符号问题。

    【讨论】:

    • 一些大写字符没有对应的小写字母。有些有多个小写等价物。有点乱。
    【解决方案2】:

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

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

    utf8_spanish_ci(现代西班牙语)和 utf8_spanish2_ci(传统西班牙语)

    这些人非常了解语言,知道 N 和 n 应该放在一起,但 Ñ 和 ñ 是 N 和 O 之间的不同字母。在西班牙语中,Ñ 实际上是不同的字母,而不是口音。

    将您的列排序规则设置为 utf8_spanish_ci,一切都会按照您想要的方式工作。

    【讨论】:

    • 谢谢,但就像我提到的,我担心的不仅仅是西班牙语。有很多不同语言的东西。
    • 嗯。想出 Unicode 排序规则的人都是优秀的语言学家。如果有一个通用的解决方案可以为所有罗马字母语言做正确的事情,他们就会实现它。您可能需要根据用户的语言进行一些语言敏感查询。您可以在 WHERE 语句中放置 COLLATE 子句。
    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 2017-04-15
    • 2011-11-28
    • 2012-01-31
    • 2012-06-05
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多