我有一个数据库,该数据库目前正在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;

编辑 - 更改为UNDEX。

我已经检查并重新检查了两个服务器之间的所有Charset和整理变量,它们看起来相同。即使不是他们,我也要自己指定整理。

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

编辑:这是我用来丢弃数据库的命令:

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

如何检查客户连接的汇合物?

有帮助吗?

解决方案 2

从LiveJournal上的一个好友那里,我发现这是5.0至5.1之间的错误“修复”:他们改变了整理。如果您阅读了错误报告,他们实际上 破产 它(Weis和Weiss不应等效)。但是他们不会揭穿它。因此,我要么不得不更改整理(如Dave Orr建议),要么手动编辑我的数据。

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

其他提示

具体问题是,在UTF8_General_Ci中,“ Weis”和“Weiß”是等效的。如果您希望“Weiß”等于“ Weiss”,则应使用UTF8_UNICODE_CI。这将在进口方面解决问题(除非您在数据库中有“ weiss”,否则您确实确实有重复的内容)。

猜猜原始表有UTF8_UNICODE_CI集,您没有注意到差异。如果那不是真的,我不知道您的桌子如何进入状态,但是切换到右侧的整理应该解决您的问题。

您正在使用 mysqldump & mysql 从5.0中的5.1起?
您可以尝试其他组合。

“唯一”列中的源B可以包含重复值吗?
删除“唯一键”约束,并检查目标db中哪些记录重复。
这可能会使问题有所了解。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top