ERROR 1062(23000):重复输入'?'关键' PRIMARY'有两个不同的条目

时间:2014-04-15 03:11:20

标签: mysql utf8mb4

我试图将一个从SQLite导入到MySQL的表包含很多日文汉字字符。 我尝试插入数据的表格如下所示:

+--------------+----------+------+-----+---------+-------+
| Field        | Type     | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| literal      | char(10) | NO   | PRI | NULL    |       |
| grade        | int(11)  | YES  |     | NULL    |       |
| stroke_count | int(11)  | YES  |     | NULL    |       |
| freq         | int(11)  | YES  |     | NULL    |       |
| jlpt         | int(11)  | YES  |     | NULL    |       |

当我尝试

INSERT INTO main VALUES('',NULL,2,NULL,NULL);

我收到了下一个错误:

mysql>
ERROR 1062 (23000): Duplicate entry '?' for key 'PRIMARY'
And if try to look up that entry i get:

select * from main where literal = '';
+---------+-------+--------------+------+------+
| literal | grade | stroke_count | freq | jlpt |
+---------+-------+--------------+------+------+
|       |  NULL |            4 | NULL | NULL |
+---------+-------+--------------+------+------+
1 row in set (0.00 sec)

为什么要查找''它显示为''?

我认为它可能与UTF8编码有关,所以我按照link的说明将所有Db和表重新配置为utf8mb4。

这是mysql配置:

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

之后,nohing改变了......任何想法?

由于

最好的问候

1 个答案:

答案 0 :(得分:2)

根据排序规则,这两个字符可能会被视为等效字符。 您可以尝试另一种排序规则 - utf8mb4_bin,但是您必须注意降低应用程序代码中的所有值,以确保主键不区分大小写。

或者您可以在此数据库中查找您在示例中给出的字符(我不能发布超过2个链接,抱歉): http://codepoints.net/

他们的UTF代码点是: U + 20089 U + 2000B

点击此处查看标准整理地图:http://www.unicode.org/charts/uca/

我在任何Unicode排序规则图中都找不到这两个字符,但是很多情况下拉丁字符都带有变音符号(例如'Ç'和'C'),它们在utf8不区分大小写的排序规则映射中被定义为等价物