MySQL在e和é之间的区别(e急性)-UNIQUE索引

我有一个表,students与3列:idname,和age。我有关于列和的UNIQUE索引。Index_2``name``age

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é”之间没有任何区别。我如何解决这个问题以及为什么会这样?

表学生的字符集为“ utf8”,排序规则为“ utf8_general_ci”。

ALTER TABLE `students` CHARACTER SET utf8 COLLATE utf8_general_ci;

我已更改为使用归类utf8_bin:

ALTER TABLE `students`

CHARACTER SET utf8 COLLATE utf8_bin;

但我收到同样的错误。

但是,如果我从字符集utf8和排序规则utf8_bin开始创建表,如下所示:

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

这似乎很奇怪。

我在这里看到了另一个答案。我不确定用户是否删除了它或迷路了。我只是在测试它:

用户写道,他首先创建了具有3个不同字符集的3个表:

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'

我不确定为什么在他这方面该INSERT命令有效,而对我而言却无效。

他还写道,他在Linux上的Mysql上对此进行了测试-必须对此做点什么?!即使我也不这么认为。

回答:

排序规则为“ utf8_general_ci”。

这就是答案。如果您使用utf8_general_ci(实际上适用于所有utf_..._[ci|cs])排序规则,则变音符号会被绕过比较,因此:

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

结果1。索引也使用归类。

如果你想进行区分ąa再使用utf8_bin排序规则(请记住,它也是大写和小写字母区分)。


顺便说一下,名称和年龄不能保证任何唯一性。

以上是 MySQL在e和é之间的区别(e急性)-UNIQUE索引 的全部内容, 来源链接: utcz.com/qa/404493.html

回到顶部