【问题标题】:mysql utf8 latin, fails on duplicate key entrymysql utf8 latin,重复键输入失败
【发布时间】:2025-12-14 23:10:02
【问题描述】:

我刚刚收到一个 SQL 插入脚本,但它在重复的键条目上失败:

我正在尝试插入:

1)蒙大拿州

2)蒙大拿州

我的表都是utf8_spanish2_ci,

谁能解释为什么会这样?

【问题讨论】:

标签: mysql utf-8 character-encoding


【解决方案1】:

utf8_spanish2_cicollation 确实不仅不区分大小写,而且部分不区分重音,所以 ñ = n(正如 Joni Salonen 指出的那样,这是不正确的! ) 但á = a

据我所知,除了utf8_bin 之外,没有带有此“功能”的排序规则。

你可以做什么:

  • 对表使用二进制排序规则(不过,other problems 附带)
  • 对特定使用二进制排序规则(可能是您的最佳选择)
  • 使用不同的列作为键列 - 您确定该列首先需要是唯一键吗?如果这是用于主键,那么数字自动增量不是更适合吗?

【讨论】:

  • 如果包含“Montana”和“Montaña”的列应该有唯一的行,dbms 需要知道这一点。是否添加数字列作为代理键都没有关系。 this 列上没有唯一约束的数字代理将允许 {1, Montana}{2, Montana}{365, Montana} 等行。
  • @Catcall 是的,但我不确定这是否真的是真正的要求。这可能是 OP 错误地选择名称作为主键而不是自动递增的情况。我们会看到
  • 您好,感谢您的回答,我最终使用 varbinary 作为我的列数据类型和 utf8_spanish_ci 作为我的字符集(因为这比 ut8_bin 更快??)我在此列上有一个唯一键,我的主键是 auto_increment
  • 1. utf8_spanish2_ci 确实认为 ñ 不同于 n。 2. utf8_bin 比 utf8_spanish_ci 简单很多;我怀疑它可能会更慢。
  • @Joni 哦,我的立场是正确的!谢谢。那么为什么会发生这种情况真的很奇怪。尽管即使在西班牙语排序规则中也看到à = a,但无论如何这可能会成为一个问题
【解决方案2】:

这很可能是由于排序规则认为蒙大拿州和蒙大拿州是相同的。

(排序规则决定了String比较的结果。)

【讨论】:

    【解决方案3】:

    您确定此特定列具有排序规则 utf8_spanish2_ci 吗?

    根据此排序规则,Montana 和 Montana 不相等,您可以使用以下 SQL 进行验证:

    mysql> select 'Montana' = 'Montaña' collate utf8_spanish2_ci as eq;
    +----+
    | eq |
    +----+
    |  0 |
    +----+
    

    排序规则是否可能以某种方式更改为 utf8_general_ci?在这个排序规则中,n 和 ñ 是相等的。

    【讨论】: