0

我有一个名为 tag 的表,在 name 列上有一个唯一约束:

CREATE TABLE `tag` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_389B7835E237E06` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=13963 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

此表的排序规则是 utf8_unicode_ci。当我尝试插入以下 2 个条目时,我得到一个“完整性约束违规”执行。

SQL 日志:

130607 14:35:53  1096 Connect   imtpdb@localhost on imtpdb
1096 Query     SET NAMES utf8
1096 Query     START TRANSACTION
1096 Query     INSERT INTO tag (name) VALUES ('até')
1096 Query     INSERT INTO tag (name) VALUES ('ate')
1096 Query     rollback
1096 Quit

确切的错误信息是:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'ate' for key 'UNIQ_389B7835E237E06'

我的.cnf:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
default-character-set = utf8
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

我正在运行 mysql 5.1.54。我一直试图弄清楚这一点现在无济于事。有谁知道我做错了什么?哦,只是为了说明这一点。表中不存在该条目。

4

1 回答 1

2

排序规则utf8_unicode_ci既不区分大小写又不区分重音,这就是它考虑'até''ate'重复的原因。没有不区分大小写和重音的 unicode 多语言排序规则。根据您的需要,您可以尝试不同的解决方法。一些相关问题:

于 2013-06-07T23:50:49.983 回答