【问题标题】:Converting from 5.0.27 to 5.1.41, getting duplicate key errors (1062)从 5.0.27 转换到 5.1.41,得到重复键错误 (1062)
【发布时间】:2010-09-06 23:54:44
【问题描述】:

我有一个当前在 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

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

【问题讨论】:

  • 我刚试过,效果很好。我正在使用 5.1.41-3ubuntu12.6。你呢?
  • mysql Ver 14.14 Distrib 5.1.41,对于使用 readline 6.1 的 debian-linux-gnu (i486),您使用的是什么字符集。我确信这是问题所在,但我不知道有什么区别。
  • 另外,我重新编辑以将插入更改为使用 UNHEX .....当您使用该版本时它是否仍然适用于您(我认为不同的编辑器会破坏脚本)。跨度>

标签: mysql mysqldump mysql-error-1062


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您使用的是 5.1 的 5.0 中的 mysqldumpmysql 吗?
      你可以尝试不同的组合。

      sourceDB 是否会在“唯一”列中包含重复值?
      删除“UNIQUE KEY”约束并检查目标数据库中哪些记录是重复的。
      这可以让我们深入了解这个问题。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-28
          • 2018-05-01
          • 2014-02-02
          • 1970-01-01
          • 2020-02-05
          • 2011-07-13
          • 2013-01-14
          相关资源
          最近更新 更多