mysql 字符集 utf 8 排序规则(dup 键)无法正常工作

Posted

技术标签:

【中文标题】mysql 字符集 utf 8 排序规则(dup 键)无法正常工作【英文标题】:mysql character set utf 8 collation (dup key) not working properly 【发布时间】:2016-03-13 00:57:42 【问题描述】:

我的数据库表字符集和排序规则分别设置为utf-8utf8_general_ci。我在 varchar 列中插入了一条值为 'säî kîråñ' 的记录。我对此有一个独特的列约束。当我尝试插入“sai kiran”时,它给出的重复条目指的是旧插入的“säîkîråñ”行。

正如您所见,两个字符串中的字符在 utf8 字符集中完全不同,无法理解为什么它显示错误为“重复条目”。

我尝试将排序规则更改为utf8_unicode_ci,但没有用。我尝试直接插入 phpmyadmin 以避免 prog lang 编码问题,但问题仍然存在。

【问题讨论】:

建立连接后你在SET NAMES utf8吗? 我有大量的插入,所以在 phpmyadmin 中使用文件上传(使用插入语句),并且上传文件时在 phpmyadmin 中选择的默认字符集是“utf8”。 我不确定排序规则对唯一约束有什么影响,但如果它确实影响它,你会想要一个 bin 排序规则而不是通用或 unicode 排序规则. 是的,我知道 utf8_bin 适用于区分大小写的比较。在 utf8_general_ci 的情况下,我认为只有 'a' 和 'A' 会被同等对待,但从here 我发现即使是 'a' 和 'ä' 也会被同等对待。所以 utf8_bin 是区别对待它们的终极解决方案。不过很好的学习...... mysql distinction between e and é (e acute) - UNIQUE index的可能重复 【参考方案1】:

utf8_general_ci 的情况下,我认为只有'a' and 'A' 会被同等对待,但从here 我发现即使'a' and 'ä' 也会被同等对待。所以utf8_bin 是区别对待它们的终极解决方案。不过很好学。

【讨论】:

请注意select 'a' = 'ä' 为真,但select 'a' collate utf8_bin = 'ä' collate utf8_bin 为假。 在大多数(不是全部)utf8 排序规则中,A=a=À=Á=Á=Â=Ã=Ä=Å=à=á=á=â=ã=ä=å=Ā =ā=Ą=ą .对于 utf8_bin,所有这些都是不同的。【参考方案2】:

由于缺少utf8_..._ci_as 排序规则,您应该(至少)将该列的排序规则更改为utf8_bin。然后,不是所有这些都相等S=s=Ş=ş=Š=Š=š=š,而是它们都将不同。特别注意。 sS 在 utf8_bin 中是不同的。

【讨论】:

以上是关于mysql 字符集 utf 8 排序规则(dup 键)无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

mysql 5.5 utf-8 排序规则 utf8_unicode_ci, pymysql

mysql 排序规则

MySQL的排序规则

Mysql 排序规则选择

如何将整个 MySQL 数据库字符集和排序规则转换为 UTF-8?

mysql设置字段的排序规则对大小写敏感