Pau*_*aul 16 mysql indexing constraints character-encoding
我有一个表,students与3列:id,name,和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;
Run Code Online (Sandbox Code Playgroud)
我试过这个插入选项:
insert into students (id, name, age)
values (1, 'Ane', 23);
Run Code Online (Sandbox Code Playgroud)
这工作正常.比我尝试过这个(参见Ané - e acute):
insert into students (id, name, age)
values (2, 'Ané', 23);
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
"Duplicate entry 'Ané-23' for key 'Index_2'"
Run Code Online (Sandbox Code Playgroud)
MySQL以某种方式不区分"Ane"和"Ané".我如何解决这个问题以及为什么会这样?
桌上学生的字符集是"utf8",校对是"utf8_general_ci".
ALTER TABLE `students` CHARACTER SET utf8 COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)
后来编辑1:@Crozin:
我已经改为使用collation utf8_bin:
ALTER TABLE `students`
CHARACTER SET utf8 COLLATE utf8_bin;
Run Code Online (Sandbox Code Playgroud)
但我收到同样的错误.
但是如果我从charset utf8和collation 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;
Run Code Online (Sandbox Code Playgroud)
以下插入命令都可以正常工作:
insert into students2 (id, name, age)
values (1, 'Ane', 23); // works ok
insert into students2 (id, name, age)
values (2, 'Ané', 23); // works ok
Run Code Online (Sandbox Code Playgroud)
这似乎很奇怪.
稍后编辑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;
Run Code Online (Sandbox Code Playgroud)
用户的结果是:
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
Run Code Online (Sandbox Code Playgroud)
这是我的结果:
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'
Run Code Online (Sandbox Code Playgroud)
我不确定为什么这个INSERT命令有效并且对我来说不起作用.
他还写道,他在Linux上的Mysql上进行了测试 - 必须对此做些什么?!即使我不这么认为.
Cro*_*zin 14
和整理是"utf8_general_ci".
这就是答案.如果您正在使用utf8_general_ci(实际上它适用于所有utf_..._[ci|cs])整理,那么变音符号会被旁路,因此:
SELECT "e" = "é" AND "O" = "Ó" AND "ä" = "a"
Run Code Online (Sandbox Code Playgroud)
结果1.索引也使用整理.
如果你想进行区分?和a再使用utf8_bin排序规则(请记住,它也是大写和小写字母区分).
顺便说一句,名字和年龄不保证任何独特性.
小智 5
我找到
ALTER TABLE students CHARACTER SET utf8 COLLATE utf8_bin;
Run Code Online (Sandbox Code Playgroud)
对我来说不起作用,因为它没有改变现有列的整理,这可以在此查询的结果中看到:
SHOW FULL COLUMNS from students;
Run Code Online (Sandbox Code Playgroud)
但是,以下查询执行了该作业并将现有列转换为utf8_bin排序规则:
ALTER TABLE students CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
Run Code Online (Sandbox Code Playgroud)
(注意"CONVERT TO")
| 归档时间: |
|
| 查看次数: |
7374 次 |
| 最近记录: |