programing

MySQL/MariaDB가 utf8mb4를 사용할 때 고유 키를 처리할 수 없음

bestcode 2022. 9. 27. 23:59
반응형

MySQL/MariaDB가 utf8mb4를 사용할 때 고유 키를 처리할 수 없음

utf8mb4 문자열이 있는 MySQL 테이블이 있습니다.

CREATE TABLE `test` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `test_code_unique` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

특수 문자를 삽입하면 잘못된 변환이 나타납니다.

mysql> insert into `test` (`code`, `name`) values ('munster', 'Munster');


mysql> insert into `test` (`code`, `name`) values ('münster', 'Münster');
ERROR 1062 (23000): Duplicate entry 'münster' for key 'test_code_unique'


mysql> SELECT * FROM test WHERE code='münster';
+----+---------+---------+
| id | name    | code    |
+----+---------+---------+
|  1 | Munster | munster |
+----+---------+---------+
1 row in set (0.00 sec)



mysql> SELECT * FROM test WHERE code='munster';
+----+---------+---------+
| id | name    | code    |
+----+---------+---------+
|  1 | Munster | munster |
+----+---------+---------+
1 row in set (0.00 sec)

고유 키가 제거되면 두 번째 삽입이 작동하지만 쿼리가 다른 경우에도 검색에서 두 행을 반환합니다.

mysql> drop table test;


CREATE TABLE `test` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


mysql> insert into `test` (`code`, `name`) values ('munster', 'Munster');


mysql> insert into `test` (`code`, `name`) values ('münster', 'Münster');


mysql> SELECT * FROM test WHERE code='münster';
+----+----------+----------+
| id | name     | code     |
+----+----------+----------+
|  1 | Munster  | munster  |
|  2 | Münster  | münster  |
+----+----------+----------+
2 rows in set (0.00 sec)


mysql> SELECT * FROM test WHERE code='munster';
+----+----------+----------+
| id | name     | code     |
+----+----------+----------+
|  1 | Munster  | munster  |
|  2 | Münster  | münster  |
+----+----------+----------+
2 rows in set (0.00 sec)

이는 MySQL 5.7과 MariaDB 10.2에서 모두 테스트되었으며 둘 다 동일한 결과를 제공합니다.

뭐가 잘못될 수 있을까요?

이 미스테리한 문제의 이유는 당신이 사용하고 있기 때문입니다.utf8mb4_unicode_ci대조는 악센트가 있는 문자와 악센트가 없는 문자의 차이를 의도적으로 무시합니다.참조: https://dev.mysql.com/doc/refman/5.7/en/charset-general.html

이 문제를 해결하려면 에서 데이터 정렬을 변경하십시오.code까지 열을 짓다.utf8mb4_bin악센트가 있는 문자와 악센트가 없는 문자를 구별하고 caSe도 구별합니다.

언급URL : https://stackoverflow.com/questions/47119794/mysql-mariadb-unable-to-handle-unique-keys-with-when-using-utf8mb4

반응형