[MySQL]mysqldump出来数据再导入回去,为什么会出现Duplicate entry?

2013-02-13 17:14:53 +08:00
 m
库里的一个表,使用varchar(32)+int(16)作为主键,表结构:

CREATE TABLE `name_lv` (
`name` varchar(32) NOT NULL,
`lv` varchar(16) NOT NULL,
PRIMARY KEY (`name`,`lv`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk

导出数据后再倒入,同样环境,同样数据库版本,出现几十个Duplicate entry异常,不得已只得增加强制倒入参数
数据量2000万的表里,几十个错误,并不是很多:

ERROR 1062 (23000) at line 3532: Duplicate entry '123?-10' for key 'PRIMARY'
ERROR 1062 (23000) at line 3584: Duplicate entry 'admin?-10' for key 'PRIMARY'
ERROR 1062 (23000) at line 3593: Duplicate entry 'basten?-10' for key 'PRIMARY'
ERROR 1062 (23000) at line 3607: Duplicate entry 'condor?-10' for key 'PRIMARY'
ERROR 1062 (23000) at line 3846: Duplicate entry '武士の太太?-10' for key 'PRIMARY'
ERROR 1062 (23000) at line 3849: Duplicate entry '小小?-10' for key 'PRIMARY'
ERROR 1062 (23000) at line 3695: Duplicate entry 'm?o蕶薍﹎-10' for key 'PRIMARY'
ERROR 1062 (23000) at line 3799: Duplicate entry '″★→癫茜?-10' for key 'PRIMARY'
ERROR 1062 (23000) at line 3801: Duplicate entry '闇嶅?缈-10' for key 'PRIMARY'
ERROR 1062 (23000) at line 3802: Duplicate entry '闆勫帤璐?pq-10' for key 'PRIMARY'
ERROR 1062 (23000) at line 3803: Duplicate entry '冰酷?-10' for key 'PRIMARY'

怀疑name字段里的这个?号是一个GBK编码不包含的字符所以会产生这个问题?
那为什么可以录入呢?(录入时正常,导出,再倒入即出Duplicate entry)

这是个什么问题?如何避免这个情况,怎么解决呢?

谢谢 :)
6111 次点击
所在节点    MySQL
6 条回复
clowwindy
2013-02-13 17:37:59 +08:00
有些 GBK 编码器有个问题,有些超出 GBK 编码范围的字符可以 encode 成 GBK(不会报错),但无法再 decode 出来。对数据完整性来说这是一件很恐怖的事情。
lqs
2013-02-13 23:25:14 +08:00
先把表的字符集改成gb18030或utf8,这样保证所有Unicode字符都能编码解码
m
2013-02-14 03:40:00 +08:00
@clowwindy 恩。。那应该怎么解决这个问题呢?
m
2013-02-14 03:43:34 +08:00
@lqs 选择GBK编码因为name_lv表使用了大量中文name,使用GBK编码比UTF-8节约了一些空间,假设不改编码这个问题有啥办法吗?
Hualin
2013-02-14 04:55:26 +08:00
谷歌出很久很久以前的帖子:[MySQL] bug - multiple column primary key cannot correctly determine duplicate entry

http://grokbase.com/t/mysql/mysql/014et5ba8c/bug-multiple-column-primary-key-cannot-correctly-determine-duplicate-entry

你确定varchar(32) 能对 gbk 正确导出吗?也许超出范围了,系统替换了,然后 数字10 重复了
lqs
2013-02-16 15:32:28 +08:00
@m gb18030能兼容gbk,而且对unicode中的其他字符也能编码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/60317

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX