반응형
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
반응형
'programing' 카테고리의 다른 글
instanceOf(클래스)와 같은 것이 있습니까?instanceOf(클래스)와 같은 것이 있습니까?c) 자바어?c) 자바어? (0) | 2022.09.27 |
---|---|
언제 NoSQL로 전환합니까? (0) | 2022.09.27 |
존재하지 않는 코드 오류 - 마리아DB (0) | 2022.09.27 |
런타임에 위치 권한을 요청하는 방법 (0) | 2022.09.27 |
IntelliJ에서 Maven의 Java 버전을 변경하는 방법 (0) | 2022.09.27 |