天津做无痛人流费用五洲网站,网站开发项目合同书,像聚美网站建设费用,创意 国外 网站在创建要给表的时候遇到一个有意思的问题#xff0c;提示Specified key was too long; max key length is 767 bytes#xff0c;从描述上来看#xff0c;是Key太长#xff0c;超过了指定的 767字节限制。通常出现在尝试创建一个过长的唯一键#xff08;UNIQUE KEY#xf…在创建要给表的时候遇到一个有意思的问题提示Specified key was too long; max key length is 767 bytes从描述上来看是Key太长超过了指定的 767字节限制。通常出现在尝试创建一个过长的唯一键UNIQUE KEY或主键PRIMARY KEY时。MySQL对于InnoDB存储引擎有一个索引键长度的限制这个限制基于字符集的不同而不同。
下面是产生问题的表结构
CREATE TABLE test_table (id int(11) unsigned NOT NULL AUTO_INCREMENT,name varchar(1000) NOT NULL DEFAULT ,link varchar(1000) NOT NULL DEFAULT ,PRIMARY KEY (id),KEY name (name)
) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4;在使用utf8字符集时每个字符可能占用3个字节那么对于innodb表索引键的最大长度大约为1000个字符左右因为3072 / 3 ≈ 1024。若字符集是utf8mb4每个字符可能占用4个字节所以最大长度会进一步减少到768个字符左右3072 / 4 768 uf8mb4字符集: 要在 Mysql 中保存 4 字节长度的 UTF-8 字符需要使用 utf8mb4 字符集mb4就是most bytes 4的意思专门用来兼容四字节的unicode但只有 5.5.3 版本以后的才支持。 为了获取更好的兼容性应该总是使用 utf8mb4 而非 utf8. 对于 CHAR 类型数据utf8mb4 会多消耗一些空间根据 Mysql 官方建议使用 VARCHAR 替代 CHAR。其实utf8mb4是utf8的超集理论上原来使用utf8然后将字符集修改为utf8mb4也会不会对已有的utf8编码读取产生任何问题。当然为了节省空间一般情况下使用utf8也就够了。 对于name我们设置长度为1000可变字符因为采用utf8mb4编码, 所以它的大小就变成了 1000 * 4 767 所以再不修改其他配置的前提下varchar的长度大小应该是 767 / 4 191 有兴趣的同学可以测试下分别指定name大小为191, 192时是不是前面的可以创建表成功后面的创建表失败并提示错误Specified key was too long; max key length is 767 bytes
解决办法
使用innodb引擎
启用innodb_large_prefix选项修改约束扩展至3072字节 重新创建数据库 my.cnf配置
set global innodb_large_prefixon;
set global innodb_file_per_tableon;
set global innodb_file_formatBARRACUDA;
set global innodb_file_format_maxBARRACUDA;上面这个3072字节的得出原因如下
我们知道InnoDB一个page的默认大小是16k。由于是Btree组织要求叶子节点上一个page至少要包含两条记录否则就退化链表了。 所以一个记录最多不能超过8k。又由于InnoDB的聚簇索引结构一个二级索引要包含主键索引因此每个单个索引不能超过4k 极端情况pk和某个二级索引都达到这个限制。 由于需要预留和辅助空间扣掉后不能超过3500取个“整数”就是(1024*3)。
在创建表的时候加上 row_formatDYNAMIC
CREATE TABLE test_table (id int(11) unsigned NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL DEFAULT ,link varchar(255) NOT NULL DEFAULT ,PRIMARY KEY (id),KEY name (name)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 row_formatDYNAMIC;这个参数的作用如下
MySQL 索引只支持767个字节utf8mb4 每个字符占用4个字节所以索引最大长度只能为191个字符即varchar(191)若想要使用更大的字段mysql需要设置成支持数据压缩并且修改表属性 row_format {DYNAMIC|COMPRESSED}