当使用用mySQL编码的varchar字段作为主键时,我已经预料到了utf8的奇怪行为。对于在我的开发环境中不相等的字符串,它由于重复键错误而失败。
一个简短的例子:
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'.
我使用默认配置在ubuntu13.10上运行mySQL 5.5.35。
在另一个mySQL服务器(5.0.95版)上,相同的查询没有失败。这是因为mySQL版本,还是有设置索引表编码的配置选项?
我在尝试将mySQL转储从生产性服务器导入到我的开发环境时遇到了这个问题。
发布于 2014-02-23 16:09:48
根据bug: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,您肯定会遇到其他不兼容的情况。
发布于 2014-02-23 15:58:28
问题是数据库没有将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ß');看这里的演示
您的问题是一个与德国charcters讨论这里的错误。
发布于 2019-06-20 15:24:19
utf8_general_mysql500_ci和utf8_general_ci在ß是否被视为等于s的问题上有所不同。
为了“修复”不兼容性,在utf8_general_mysql500_ci 5.1.62 / 5.5.21 / 5.6.5中添加了排序规则MySQL。
更多历史:_
https://stackoverflow.com/questions/21969927
复制相似问题