【问题标题】:Mysql UNIQUE KEY constraint - a and å are treated as the same charactersMysql UNIQUE KEY 约束 - a 和 å 被视为相同的字符
【发布时间】:2015-10-05 01:42:36
【问题描述】:

我在一列上有一个唯一键。当我插入a 然后å 它会抛出一个错误:

PHP 致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[23000]:完整性约束违规:1062 Duplicate entry 'å' for key 'constraint-1'' in ..

....但是 aå 是不同的 UTF 字符 - 那么发生了什么......?

表有 DEFAULT CHARSET=utf8mb4utf8mb4_unicode_ci 排序规则。

【问题讨论】:

  • MySQL 对定义排序顺序和字母等效性的每一列应用排序规则。对于应用于此列的排序规则,这两个字母被认为是等效的。
  • @HoboSapiens 我认为排序规则仅用于排序,而插入唯一重要的是字符集??
  • 你错了。请参阅我链接到的问题。您需要使用utf8_bin 排序规则来区分这些字符。您可以使用 COLLATE 子句覆盖默认排序规则。关于这个主题的 MySQL 参考是 here

标签: php mysql unicode utf-8 utf8mb4


【解决方案1】:

在唯一列上使用排序规则latin1_swedish_ci

【讨论】:

  • 我不是反对你的人,但我确实存储了 utf 数据 - 所以我认为简单地更改排序规则不适用于这种情况。
  • 是的,我在相同的环境中测试过,它对我有用。
  • 我的Server connection collation = utf8mb4_unicode_ci。排序规则 - 表 latin1_swedish_cilatin1_swedish_ci 非常适合我。请您试一次。
  • 这里有完整的细节。服务器:127.0.0.1 通过 TCP/IP 服务器类型:MySQL 服务器版本:5.6.24 - MySQL 社区服务器 (GPL) 协议版本:10 用户:root@localhost 服务器字符集:UTF-8 Unicode (utf8)
  • 当世界其他地方都在转向 UTF8 时,切换到像 latin1_swedish_ci 这样更严格的排序规则是愚蠢的。即使这样可行,这也是一个糟糕的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多