从5.0.27转换为5.1.41,导致重复键错误(1062)

时间:2010-09-06 23:54:45

标签: mysql mysqldump mysql-error-1062

我有一个当前在5.0.27服务器上运行的数据库。我想转移到新的5.1.41服务器。

我mysqldump了所有文件。恢复时,我收到错误

ERROR 1062 (23000) at line 21: Duplicate entry 'weiÃ' for key 'title'

我已经将故障缩小到这个脚本,我可以运行它并且它失败了:

--
-- Table structure for table `word`
--

set names utf8;

DROP TABLE IF EXISTS `word`;
CREATE TABLE `word`
(
  `wordid` int (10) unsigned NOT NULL auto_increment,
  `title` char (50) NOT NULL default '',
  PRIMARY KEY  (`wordid`),
  UNIQUE KEY `title` (`title`)
) ENGINE=MyISAM AUTO_INCREMENT=280707 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

--
-- Dumping data for table `word`
--

LOCK TABLES `word` WRITE;
INSERT INTO `word` VALUES
(198036,'weis'),
(241473, unhex('776569C39F'));
UNLOCK TABLES;

编辑 - 改为UNHEX。

我检查并重新检查了两台服务器之间的所有字符集和校对变量,它们看起来完全相同。即使他们不是,我也会自己指定整理。

关于我在这里做错了什么的线索?

编辑:这是我用来转储数据库的命令:

mysqldump --add-drop-table --add-locks --disable-keys --lock-tables --quick  -uusername -ppassword database > filename

并加载

mysql -D$MYSQL_DB -u$MYSQL_USER -p$MYSQL_PASSWD < filename

如何检查客户端连接的排序规则?

4 个答案:

答案 0 :(得分:1)

具体问题是在utf8_general_ci中,'weis'和'weiß'是等价的。如果你想'weiß'等于'weiss',那么你应该使用utf8_unicode_ci。这将解决导入方面的问题(除非你在数据库中有'weiss',但是你真的有重复)。

猜测,原始表设置了utf8_unicode_ci,您没有注意到差异。如果那不是真的,我不知道你的桌子是如何进入它所处的状态的 - 但是切换到正确的整理可以解决你的问题。

答案 1 :(得分:1)

来自LiveJournal的好友,我发现它是5.0和5.1之间的错误“修复”:他们改变了整理。如果您阅读错误报告,他们实际上打破它(weis和weiss不应该相同)。但他们不会破坏它。所以我要么必须改变整理(如Dave Orr建议的那样),要么手动编辑我的数据。

http://bugs.mysql.com/bug.php?id=27877

答案 2 :(得分:0)

您使用的是mysqldump&amp; {3.1}来自5.0的mysql? 你可以尝试不同的组合。

sourceDB是否可以在“unique”列中包含重复值?
删除“UNIQUE KEY”约束并检查targetDB中哪些记录重复 这可以提供一些问题的洞察力。

答案 3 :(得分:0)

通过--default-character-set选项指定字符集。这很重要。