Tôi có một bảng, students
, với 3 cột: id
, name
và age
. Tôi có một chỉ số UNIQUE
Index_2
trên các cột name
và age
.Phân biệt MySQL giữa e và é (e cấp tính) - Chỉ số UNIQUE
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;
tôi đã cố gắng lựa chọn chèn này:
insert into students (id, name, age)
values (1, 'Ane', 23);
mà hoạt động ok. Hơn tôi đã thử cái này (xem Ane - e cấp):
insert into students (id, name, age)
values (2, 'Ané', 23);
và tôi nhận được thông báo lỗi này:
"Duplicate entry 'Ané-23' for key 'Index_2'"
MySQL bằng cách nào đó không thực hiện bất kỳ sự phân biệt giữa "Ane "và" Ané ". Làm thế nào tôi có thể giải quyết điều này và tại sao điều này đang xảy ra?
Bộ ký tự cho học sinh bảng là "utf8" và đối chiếu là "utf8_general_ci".
ALTER TABLE `students` CHARACTER SET utf8 COLLATE utf8_general_ci;
Sau edit1: @Crozin:
Tôi đã thay đổi để sử dụng đối chiếu utf8_bin:
ALTER TABLE `students`
CHARACTER SET utf8 COLLATE utf8_bin;
nhưng tôi nhận được lỗi tương tự.
Nhưng nếu tôi có thể tạo bàn từ đầu với utf8 charset và collation utf8_bin, như thế này:
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;
cả dưới lệnh chèn làm việc ok:
insert into students2 (id, name, age)
values (1, 'Ane', 23); // works ok
insert into students2 (id, name, age)
values (2, 'Ané', 23); // works ok
này có vẻ là rất lạ.
Sau đó chỉnh sửa 2:
Tôi thấy câu trả lời khác ở đây. Tôi không chắc chắn nếu người dùng bị xóa hoặc bị mất. Tôi chỉ thử nghiệm nó:
Người dùng đã viết rằng đầu tiên ông đã tạo ra 3 bảng với 3 bảng mã khác nhau:
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;
Kết quả của việc sử dụng bao gồm:
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
Dưới đây là kết quả của tôi :
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'
Tôi không chắc chắn lý do tại sao phần này làLệnhhoạt động và tôi không hoạt động.
Ông cũng viết rằng ông đã thử nghiệm điều này trên Mysql trên Linux - phải làm gì đó với điều này ?! Ngay cả tôi cũng không nghĩ vậy.
Không liên quan đến câu hỏi của bạn, nhưng không bao giờ có ý tưởng hay để có khóa duy nhất trên trường tên ... Nhiều người có cùng tên. Bạn dự định làm gì trong trường hợp đó? Điều đó nói rằng, thực tế bạn đã tạo ra một chìa khóa duy nhất dựa trên tên và tuổi sẽ đề nghị một quyết định thiết kế ..... –
Hi Brendan, đây chỉ là một ví dụ, một hư cấu - không giống như tôi có trong dự án Tôi làm! Tôi biết không phải là ok để có một chỉ số duy nhất trên các cột như 'tên' và 'tuổi'. Tôi đã chọn ví dụ này (không phải là một người rất thông minh - tôi quản trị) thay vì chọn ví dụ thực có chứa hơn 10 cột .... – Paul
Điều đó có ý nghĩa. –