首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >E和é之间的MySQL区别(e急性)-唯一索引

E和é之间的MySQL区别(e急性)-唯一索引
EN

Stack Overflow用户
提问于 2011-06-24 19:09:46
回答 4查看 8.3K关注 0票数 17

我有一个表students,它有3列:idnameage。我在列nameage上有一个UNIQUE索引Index_2

代码语言:javascript
复制
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;

我尝试了这个插入选项:

代码语言:javascript
复制
insert into students (id, name, age)
values (1, 'Ane', 23);

它工作得很好。然后我试过这个(参见Ané - e acute):

代码语言:javascript
复制
insert into students (id, name, age)
values (2, 'Ané', 23);

然后我收到了这个错误消息:

代码语言:javascript
复制
"Duplicate entry 'Ané-23' for key 'Index_2'"

不知何故,MySQL没有对"Ane“和"Ané”做任何区分。我如何解决这个问题?为什么会发生这种情况?

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

代码语言:javascript
复制
ALTER TABLE `students` CHARACTER SET utf8 COLLATE utf8_general_ci;

后来的edit1:@Crozin:

我已更改为使用排序规则utf8_bin:

代码语言:javascript
复制
ALTER TABLE `students`
CHARACTER SET utf8 COLLATE utf8_bin;

但我收到了相同的错误。

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

代码语言:javascript
复制
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命令都工作正常:

代码语言:javascript
复制
insert into students2 (id, name, age)
values (1, 'Ane', 23); // works ok

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

这看起来很奇怪。

稍后编辑2:

我在这里看到了另一个答案。我不确定是用户删除了还是丢失了。我只是在测试它:

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

代码语言:javascript
复制
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;

用户的结果是:

代码语言:javascript
复制
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

以下是我的结果:

代码语言:javascript
复制
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上测试了这一点-与此有什么关系?!就连我也不这么认为。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6466901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档