mySQL:索引表上的utf8字符集和重复键错误

时间:2014-02-23 15:04:58

标签: mysql utf-8

当使用utf8中编码的varchar字段作为主键时,我预料到mySQL会出现奇怪的行为。对于在我的开发环境中不相等的字符串,它失败并出现重复键错误。

一个简短的例子:

SET NAMES 'utf8';

CREATE TABLE `test` (
  `id` varchar(5) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test` (`id`) VALUES ('das'), ('daß');

失败并显示错误:Duplicate entry 'daß' for key 'PRIMARY'.

我在ubuntu 13.10上使用默认配置运行mySQL 5.5.35。

在另一个mySQL Server(版本5.0.95)上,相同的查询没有失败。这是因为mySQL版本还是有配置选项来设置索引表的编码?

我在尝试将mySQL转储从高效服务器导入我的开发环境时遇到了这个问题。

3 个答案:

答案 0 :(得分:1)

问题是数据库没有重新daß它重新统一为das然后它成为id的双重条目,而这只是一个测试表

为什么不用autoincrenebt和其他列名创建列id,你有这些值就像那样:

SET NAMES 'utf8';
CREATE TABLE `test` (
`id` int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
 `name` varchar(5)
 ) ENGINE=MYISAM DEFAULT CHARSET=utf8;

 INSERT INTO `test` (`name`) VALUES ('das'), ('daß');

WATCH DEMO HERE


  

你的问题是与德国人一起讨论here的错误。

答案 1 :(得分:1)

根据此错误中的讨论,您应该在使用德语字符时使用排序规则utf8_unicode_ciBug #39816 German collation under utf8_unicode_ci is incorrect

尽管有这个bug的标题,我只是在5.6.15测试了这个,你的测试用例正常,而默认的unicode整理不起作用:

CREATE TABLE `test` (
  `id` varchar(5) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_unicode_ci;

INSERT INTO `test` (`id`) VALUES ('das'), ('daß');

PS:我建议您使用与生产环境相同版本的所有软件的开发环境,或者至少共享相同的主要版本。如果在5.5中开发然后尝试部署到5.0,则必然会遇到其他不兼容问题。

答案 2 :(得分:0)

utf8_general_mysql500_ciutf8_general_ciß是否被视为等于s方面有所不同。

为“修复”不兼容问题,在MySQL 5.1.62 / 5.5.21 / 5.6.5中添加了排序规则utf8_general_mysql500_ci。

更多历史记录:http://mysql.rjweb.org/doc.php/charcoll#german_sharp_s_