当使用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 5.5.35 上运行 mySQL 13.10。
在另一个mySQL服务器(版本5.0.95)上,相同的查询没有失败。这是因为mySQL版本还是有配置选项来设置索引表的编码?
我在尝试将 mySQL 转储从生产服务器导入我的开发环境时遇到了这个问题。
此错误中的讨论,在使用德语字符时应使用排序规则utf8_unicode_ci
:错误 #39816 utf8_unicode_ci下的德语排序规则不正确。
尽管该错误的标题,我刚刚在 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,则必然会遇到其他不兼容问题。
问题是数据库没有识别daß
它重新协调为das
然后它变成了id的复式输入,而这只是一个测试表
为什么不使用具有自动 increnebt 和其他列名的列 ID 创建具有这些值的列 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ß');
在此处观看演示
您的问题是在这里与德国字符讨论的错误。
utf8_general_mysql500_ci
和utf8_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_