当前位置: 首页 > 面试题库 >

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

澹台阳秋
2023-03-14
问题内容

我有一个表,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);

可以的。比我尝试过的一个(请参阅 Ané - e急性 ):

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;

以后的edit1:@Crozin:

我已更改为使用归类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

这似乎很奇怪。

稍后编辑2:

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

用户写道,他首先创建了具有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排序规则(请记住,它也是大写和小写字母区分)。

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



 类似资料:
  • 问题内容: 可能是一个新手问题,但每个人似乎都在使用,但在处理异常时我一直都在使用。有什么区别,为什么更可取? 问题答案: 所使用的输出流与@Brian指出的输出流不同,但是详细程度也不相同-您可以尝试以下简单测试。输出: With :您只知道抛出了什么异常 java.lang.UnsupportedOperationException:尚未实现 使用:您还知道是什么原因造成的 (行号+调用堆栈)

  • 问题内容: 我正在处理一些旧代码,发现曾经使用过 但是我现在尝试 似乎在做同样的事情,还是这样做?我有点记得我这样做是有原因的,但是我不记得了,做“ man sed”并没有帮助,因为他们对-E仅一无所知- e对以太并没有多大意义。 我以为-e表示它将与正则表达式匹配… 问题答案: 从源代码开始,是与BSD sed兼容的未记录的选项。 从手册开始,在BSD中sed用于支持扩展的正则表达式。

  • 问题内容: 以下两个代码段都执行相同的操作。他们捕获每个异常并执行块中的代码 片段1- 摘要2- 两种结构到底有什么区别? 问题答案: 在第二个中,您可以访问异常对象的属性: 但是它不会捕获或系统退出异常,并且: 除了一个裸露的: 有关更多信息,请参见文档的“内置异常”部分和本教程的“错误与异常”部分。

  • 问题内容: 我遇到了像这样的Java代码: 以上三种之间的区别是什么?它们在Java中如何称呼这种类型的类或接口声明? 问题答案: 好吧,前两个没有什么区别-它们只是为 type参数 (或)使用了不同的名称。 第三个不是有效的声明- 用作提供类型实 参 时使用的 通配符 ,例如,意味着引用某种类型的列表,但我们不知道是什么。 __ 所有这些都是 泛型 ,这是一个很大的话题。您可能希望通过以下资源了

  • 使用有什么区别吗: 从bash手册页上可以看出,它们是相同的,唯一的区别是,从用户角度来看,第二种格式更明确。

  • 我目前正在阅读有关通配符的文章,但我不知道它们之间是否有任何区别?扩展了Animal,E扩展了Animal。