概述
之前一直有個小誤區,我以爲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'