MySQL 学习笔记

MySQL是一个开源的关系型数据库,非常流行。

如无特殊说明,本专题文章的 SQL 均在 5.6 版本中验证。

👉文章列表
MySQL 学习笔记 ⏬ 创建和删除数据库 切换和查看数据库 创建和删除表 在表中增加、删除、修改列 添加和删除索引 增删查改 创建和删除主键 大小写和反引号 字符串类型值的大小写 SQL注释 CHAR类型 VARCHAR类型 整型数字 时间戳 不要使用utf8 唯一索引与NULL 唯一索引的单列长度限制 NULL的判等 DDL、DML、DCL的含义 查看表的状态 show table status InnoDB存储引擎的限制 if和case的使用 自定义函数 InnoDB 索引 事务 事务隔离级别的概念、查看和修改 读已提交(read committed)隔离级别下的锁 可重复读(repeatable read)隔离级别下的锁 修改自增主键id的类型 使用 load data 快速导入数据 使用 select into outfile 导出数据

MySQL: 唯一索引的单列长度限制


InnoDB存储引擎的限制 中提到对于使用utf8mb4字符集的表,TEXT、VARCHAR、CHAR等类型的列,只能用前面的 191 个字符做索引,因为 191×4=764,192×4=768,191个字符正好没有超过 767 字节的限制。如果 char、varchar 等定义的长度超过了 191,而指定索引时未说明索引长度,则会自动使用前191个字符做索引。

示例:

创建表:

create table test_table (
    c1 varchar(200) not null,
    INDEX idx_c1(c1)
) engine = InnoDB character set = utf8mb4;

查看创建表语句:

mysql> show create table test_table
+------------+-----------------------------------------+
| Table      | Create Table                            |
+------------+-----------------------------------------+
| test_table | CREATE TABLE `test_table` (             |
|            |   `c1` varchar(200) NOT NULL,           |
|            |   KEY `idx_c1` (`c1`(191))              |
|            | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+------------+-----------------------------------------+

可以看到索引中 c1 自动取了前191个字符。

但是,若是唯一索引,单列的长度不能超过 191个字符,否则报错。

create table test_table (
    c1 varchar(200) not null,
    UNIQUE INDEX idx_c1(c1)
) engine = InnoDB character set = utf8mb4;

上面的建表语句会报错如下:

(1071, u'Specified key was too long; max key length is 767 bytes')

为什么唯一索引不自动取前191个字符呢?因为若这样做,唯一性就无法保证了。


( 本文完 )

文章目录