mysql唯一索引的一個小常識--Duplicate entry 'XXX' for key 'XXX'

概述

之前一直有個小誤區,我以爲mysql的唯一索引肯定是區分大小寫的,然而實際上utf8字符集下,默認排序規則utf8_general_ci 情況下,是不區分大小寫的。而在排序規則utf8_bin下是區分大小寫的,這就有可能出現以下情況:之前字段是varchar  binary類型,即排序規則爲utf8_bin,後來將該字段改回varchar的話,就會導致唯一鍵衝突錯誤


測試

mysql> show create table xx\G
*************************** 1. row ***************************
       Table: xx
Create Table: CREATE TABLE `xx` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(100) NOT NULL,
  `name1` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`name`),
  UNIQUE KEY `name1` (`name1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> select * from xx;
Empty set (0.00 sec)

mysql> insert into xx(id,name,name1) values(1,'jiang','jiang');
Query OK, 1 row affected (0.00 sec)

mysql> insert into xx(id,name,name1) values(1,'Jiang','jason');
ERROR 1062 (23000): Duplicate entry 'Jiang' for key 'PRIMARY'
mysql> insert into xx(id,name,name1) values(1,'Jiang1','jason');
Query OK, 1 row affected (0.00 sec)

mysql> insert into xx(id,name,name1) values(1,'Jiang2','Jason');
Query OK, 1 row affected (0.00 sec)

mysql> select * from xx;
+------+--------+-------+
| id   | name   | name1 |
+------+--------+-------+
|    1 | jiang  | jiang |
|    1 | Jiang1 | jason |
|    1 | Jiang2 | Jason |
+------+--------+-------+
3 rows in set (0.00 sec)


mysql> alter table xx modify name1 varchar(100);
ERROR 1062 (23000): Duplicate entry 'Jason' for key 'name1'


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章