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-8
和utf8_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=Ş=ş=Š=Š=š=š
,而是它们都将不同。特别注意。 s
和 S
在 utf8_bin 中是不同的。
【讨论】:
以上是关于mysql 字符集 utf 8 排序规则(dup 键)无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
mysql 5.5 utf-8 排序规则 utf8_unicode_ci, pymysql