【问题标题】:Duplicate entry when inserting utf-8 data to primary key将 utf-8 数据插入主键时出现重复条目
【发布时间】:2019-11-03 06:10:42
【问题描述】:

尝试将 utf-8 数据插入 MySql 上的主键时出现重复输入错误

表定义:

CREATE TABLE `test` (
  `UserName` VARCHAR(256) NOT NULL,
  PRIMARY KEY (`UserName`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4   
COLLATE = utf8mb4_unicode_ci;

插入:

insert test(`UserName`) VALUES('büsra'), ('büşra');

结果:

Error Code: 1062. Duplicate entry 'büşra' for key 'PRIMARY'

我认为 SQL Server 配置正确:

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

character_set_client    utf8
character_set_connection    utf8
character_set_database  utf8mb4
character_set_filesystem    binary
character_set_results   utf8
character_set_server    utf8mb4
character_set_system    utf8
collation_connection    utf8_general_ci
collation_database  utf8mb4_unicode_ci
collation_server    utf8mb4_unicode_ci

我已尝试在以下位置找到解决方案:mySQL: utf8 charset on index table and duplicate key error 但找不到。

我做错了什么? 任何帮助将不胜感激。

【问题讨论】:

  • 您选择的 collat​​ion 认为这些字符在比较中是相等的……
  • @deceze 我应该使用哪种排序规则?有没有一种简单的方法来测试数据整理?
  • “您选择的排序规则认为这些字符在比较中是相等的” @deceze 不是 t100% 主题,但 8.0 版下的 MySQL 也有点奇怪,其中包含 NULL 字节检测重复项时的一些排序规则考虑this .. 这个接缝将在 MySQL 8 中修复,因为您会收到预期的 Duplicate entry 错误。
  • 哪里有NUL字节?这不应该在 UTF-8 中发生。

标签: mysql utf-8


【解决方案1】:

(感谢您将问题简化为一个非常简单的测试用例。)

utf8mb4_unicode_ci 进行大小写折叠和重音去除。因此,ş = s

utf8mb4_bin 会将它们视为不同的。但即使Aa 也会有所不同。

utf8mb4_turkish_ci 或 utf8mb4_romanian_ci 可能是您想要的?他们将ş 视为一个单独的字母,介于szta 之间。更多详情:http://mysql.rjweb.org/utf8mb4_collations.html

还有 turkish_ci,但不是 romanian_ci,将 ü 视为单独的字母。

【讨论】:

  • @Erez Ben Harush - 如果您专注于土耳其语,我会添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
相关资源
最近更新 更多