我试图将一个从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改变了......任何想法?
由于
最好的问候
答案 0 :(得分:2)
根据排序规则,这两个字符可能会被视为等效字符。 您可以尝试另一种排序规则 - utf8mb4_bin,但是您必须注意降低应用程序代码中的所有值,以确保主键不区分大小写。
或者您可以在此数据库中查找您在示例中给出的字符(我不能发布超过2个链接,抱歉): http://codepoints.net/
他们的UTF代码点是: U + 20089 U + 2000B
点击此处查看标准整理地图:http://www.unicode.org/charts/uca/
我在任何Unicode排序规则图中都找不到这两个字符,但是很多情况下拉丁字符都带有变音符号(例如'Ç'和'C'),它们在utf8不区分大小写的排序规则映射中被定义为等价物