MySQL e和e(e急性)之间的区别---唯一的指数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (109)

我有张表,students,3栏:idname,和age。我有一个UNIQUE指数Index_2nameage.

CREATE TABLE `bedrock`.`students` (  
    `id` INTEGER UNSIGNED NOT NULL
    AUTO_INCREMENT,   `name` VARCHAR(45)
    NOT NULL,   `age` INTEGER UNSIGNED NOT
    NULL,   PRIMARY KEY (`id`),   UNIQUE
    INDEX `Index_2` USING BTREE(`name`,
    `age`) ) ENGINE = InnoDB;

我尝试了以下插入选项:

insert into students (id, name, age)
values (1, 'Ane', 23);

工作正常:

insert into students (id, name, age)
values (2, 'Ané', 23);

我收到一条错误消息:

"Duplicate entry 'Ané-23' for key 'Index_2'"

MySQL在某种程度上没有区分“Ane”和“ané”。我怎么能解决这个问题为什么会发生这种事?

表学生的字符集为“UTF 8”,校对为“UTF 8”。

ALTER TABLE `students` CHARACTER SET utf8 COLLATE utf8_general_ci;

我已经更改为使用排序规则UTF 8:

ALTER TABLE `students`
CHARACTER SET utf8 COLLATE utf8_bin;

但我也收到了同样的错误。

但是,如果从字符集UTF 8和排序规则UTF 8开始创建表,就像这样:

CREATE TABLE `students2` ( 
`id` INTEGER UNSIGNED AUTO_INCREMENT, 
`name` VARCHAR(45),   `age`
VARCHAR(45),   PRIMARY KEY (`id`),  
UNIQUE INDEX `Index_2` USING
BTREE(`name`, `age`) ) ENGINE = InnoDB
CHARACTER SET utf8 COLLATE utf8_bin;

下面的插入命令都正常工作:

insert into students2 (id, name, age)
values (1, 'Ane', 23); // works ok

insert into students2 (id, name, age)
values (2, 'Ané', 23); // works ok

这似乎很奇怪。

CREATE TABLE `utf8_bin` (   `id`
int(10) unsigned NOT NULL
AUTO_INCREMENT,   `name` varchar(45)
COLLATE utf8_bin NOT NULL,   `age`
int(10) unsigned NOT NULL,   PRIMARY
KEY (`id`),   UNIQUE KEY `Index_2`
(`name`,`age`) USING BTREE )
ENGINE=InnoDB DEFAULT CHARSET=utf8
COLLATE=utf8_bin;

CREATE TABLE `utf8_unicode_ci` (  
`id` int(10) unsigned NOT NULL
AUTO_INCREMENT,   `name` varchar(45)
COLLATE utf8_unicode_ci NOT NULL,  
`age` int(10) unsigned NOT NULL,  
PRIMARY KEY (`id`),   UNIQUE KEY
`Index_2` (`name`,`age`) USING BTREE )
ENGINE=InnoDB DEFAULT CHARSET=utf8
COLLATE=utf8_unicode_ci;

CREATE TABLE `utf8_general_ci` (  
`id` int(10) unsigned NOT NULL
AUTO_INCREMENT,   `name` varchar(45)
COLLATE utf8_general_ci NOT NULL,  
`age` int(10) unsigned NOT NULL,  
PRIMARY KEY (`id`),   UNIQUE KEY
`Index_2` (`name`,`age`) USING BTREE )
ENGINE=InnoDB DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci;

用户的结果是:

Insert commands: INSERT INTO utf8_bin
VALUES (1, 'Ane', 23), (2, 'Ané', 23);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

INSERT INTO utf8_unicode_ci VALUES (1,
'Ane', 23), (2, 'Ané', 23); Query OK,
2 rows affected (0.01 sec) Records: 2 
Duplicates: 0  Warnings: 0

INSERT INTO utf8_general_ci VALUES (1,
'Ane', 23), (2, 'Ané', 23); Query OK,
2 rows affected (0.01 sec) Records: 2 
Duplicates: 0  Warnings: 0

以下是我的研究结果:

INSERT INTO utf8_bin VALUES (1, 'Ane',
23), (2, 'Ané', 23);        //works ok
INSERT INTO utf8_unicode_ci VALUES (1,
'Ane', 23), (2, 'Ané', 23); //
Duplicate entry 'Ané-23' for key
'Index_2'

INSERT INTO utf8_general_ci VALUES (1,
'Ane', 23), (2, 'Ané', 23);
//Duplicate entry 'Ané-23' for key
'Index_2'
提问于
用户回答回答于

校对是“UTF 8”_一般_“ci”。

这就是答案。如果你用utf8_general_ci(实际上它适用于所有utf_..._[ci|cs])然后在昏迷中绕过对话,因此:

SELECT "e" = "é" AND "O" = "Ó" AND "ä" = "a"

结果1.。索引也使用排序规则。

如果你想区分ąa然后使用utf8_bin排序规则(请记住,它也区分大写字符和小写字符)。


顺便说一句,姓名和年龄不能保证任何独特性。

用户回答回答于

我发现

ALTER TABLE students CHARACTER SET utf8 COLLATE utf8_bin;

由于它没有更改现有列的排序规则,因此对我不起作用,在此查询的结果中可以看到:

SHOW FULL COLUMNS from students;

但是,下面的查询完成了该工作,并将现有列转换为UTF 8_本校勘:

ALTER TABLE students CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

(请注意“转换为”)

扫码关注云+社区