在搭建博客的过程中,看到官方论坛中有人求助:

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=“存储引擎名称” 设置永久性的默认存储引擎。

文章作者: 刘同学
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 刘同学的小站
后端 Mysql
喜欢就支持一下吧