MySQL:字符集排序规则对唯一索引的影响


#MySQL 笔记


相关文章:

utf8mb4_general_ci 不区分大小写,所以...

建表:

USE test;
CREATE TABLE `test_table` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `data` varchar(32) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `uk_data` (data)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

测试插入数据:

mysql root@127.0.0.1:test> insert into test_table (data) values('hi');
Query OK, 1 row affected
Time: 0.003s
mysql root@127.0.0.1:test> insert into test_table (data) values('HI');
(1062, u"Duplicate entry 'HI' for key 'uk_data'")

插入 HI 的时候报错唯一索引冲突。为什么?因为 utf8mb4_general_ci 不区分大小写,hiHI 也就被认为是相等的。

查询数据时,也不会区分大小写:

mysql root@127.0.0.1:test> select * from test_table where data = 'HI';
+----+------+
| id | data |
+----+------+
| 1  | hi   |
+----+------+

utf8mb4_bin 区分大小写,所以...

建表:

USE test;
CREATE TABLE `test_table_2` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `data` varchar(32) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `uk_data` (data)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin;

测试插入数据:

mysql root@127.0.0.1:test> insert into test_table_2 (data) values('hi');
Query OK, 1 row affected
Time: 0.003s
mysql root@127.0.0.1:test> insert into test_table_2 (data) values('HI');
Query OK, 1 row affected
Time: 0.004s

可以看到 hiHI 都正常插入了。这是因为 utf8mb4_bin 区分大小写,所以 hiHI 是不相等的。

查询数据时也会区分大小写:

mysql root@127.0.0.1:test> select * from test_table_2 where data = 'HI';
+----+------+
| id | data |
+----+------+
| 2  | HI   |
+----+------+


( 本文完 )