1

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

我mysqldump'd所有的文件。恢复时出现错误

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

4 回答 4

1

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

猜测一下,原始表设置了 utf8_unicode_ci,而您没有注意到差异。如果这不是真的,我不知道你的表是如何进入它的状态的——但是切换到正确的排序规则应该可以解决你的问题。

于 2010-09-07T17:41:47.273 回答
1

从 LiveJournal 上的一个朋友那里,我发现这是 5.0 和 5.1 之间的错误“修复”:他们更改了排序规则。如果您阅读错误报告,他们实际上破坏了它(weis 和 weiss 不应该是等价的)。但他们不会破坏它。所以我要么必须更改排序规则(正如 Dave Orr 建议的那样),要么手动编辑我的数据。

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

于 2010-09-07T18:33:33.630 回答
0

您使用的是 5.1 of 5.0的mysqldump&吗? 你可以尝试不同的组合。mysql

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

于 2010-09-07T17:36:45.927 回答
0

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

于 2010-11-24T08:45:34.880 回答