2017-11-05 18 views
1

を使用しているときにユニークなキーを処理することができない私たちは、utf8mb4文字列とMySQLのテーブルを持っている:特殊文字を挿入するときのMySQL/MariaDB utf8mb4

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) 

ユニークであればキーが削除されて2番目の挿入は機能しますが、クエリが異なる場合でも2行が返されます。

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の両方でテストされており、どちらも同じ結果が得られます。

何が問題になる可能性がありますか?

答えて

2

この一見不思議な問題の理由は、utf8mb4_unicode_ciの照合を使用していることです。その照合では、アクセント付きの文字とアクセントのない文字の違いを意図的に無視します。参照:https://dev.mysql.com/doc/refman/5.7/en/charset-general.html

これを解決するには、アクセント付き文字と非アクセント付き文字の間に、また、ケースを区別しますutf8mb4_binからcode列に変更照合、。

+0

'utf8mb4_bin'を使うと動作します。ありがとう。 –

関連する問題