【MySql】Specified key was too long; max key length is 767 bytes
在搭建博客的过程中,看到官方论坛中有人求助:
Halo启动报错:【MySql】Specified key was too long; max key length is 767 bytes
查阅了资料并记录一下。
原来是主键的长度太长,最大长度仅支持767字节,注意,这里的是字节。
那么,我定义一个主键是varchar(500)的字段,不管我使用utf8编码,那么500字符长度将占用500*3的字节长度(utf8最多支持3个字节长度);或是我使用utf8mb4编码,那么500字符长度将占用500*4的字节长度(utf8mb4最多支持4个字节长度),都大大超过了767字节。
关闭此限制后,索引前缀的大小将可以达到3072字节。
查看长度
show variables like'innodb_large_prefix';
show variables like'innodb_file_format';
#注意:innodb_large_prefix这个属性在5.6上是默认关闭的,而在5.7上是默认开启的。解决:
set global innodb_large_prefix=on;
set global innodb_file_per_table=on;
set global innodb_file_format=BARRACUDA;
set global innodb_file_format_max=BARRACUDA;
#默认存储引擎
SET default_storage_engine = innodb;
set global innodb_default_row_format=dynamic;
#如果表已经创建了
alter table [$Table_Name] Row_format=dynamic;最后,创建表的时候,还需要指定表的 row format 格式为 Dynamic 或者 Compressed,5.6中row_format默认值为compact;如下示例:
CREATE TABLE test(
name varchar(500) CHARACTER SET utf8 COLLATE utf8_bin,
PRIMARY KEY (`name `) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
在mysql5.7中不存在该问题,默认格式正常,只要字段长度符合即可。
innodb_large_prefix=1 (默认值 1)
innodb_default_row_format=dynamic (默认是dynamic)
innodb_file_format=Barracuda (默认值 Barracuda)
SET default_storage_engine = innodb; 在mysql8.0版本中, 此参数已废弃,默认的行格式最长3072 byte。
MySQL 8.0 的默认存储引擎是 InnoDB,可以通过设置SET default_storage_engine = innodb; ; 修改会话级的默认存储引擎。
在配置 my.cnf 中的 [mysqld] 添加 default-storage-engine=“存储引擎名称” 设置永久性的默认存储引擎。
本文链接:
/archives/1705836510521
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
刘同学的小站!
喜欢就支持一下吧