mysql> select max(length(fullTopic)) from zcbus.bus_in_tables;
+————————+
| max(length(fullTopic)) |
+————————+
| 63 |
+————————+
1 row in set (0.01 sec)
mysql> ALTER TABLE zcbus.bus_in_tables ADD INDEX idx_zcbus_QovbDnKMGG09GbI (fullTopic);
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
mysql> show variables like ‘innodb_large_prefix’;
+———————+——-+
| Variable_name | Value |
+———————+——-+
| innodb_large_prefix | OFF |
+———————+——-+
1 row in set (0.00 sec)
mysql> set global innodb_large_prefix=on;
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER TABLE zcbus.bus_in_tables ADD INDEX idx_zcbus_QovbDnKMGG09GbI (fullTopic);
ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
mysql> show variables like ‘innodb_file_format’;
+——————–+———-+
| Variable_name | Value |
+——————–+———-+
| innodb_file_format | Antelope |
+——————–+———-+
1 row in set (0.00 sec)
mysql> set global innodb_file_format=Barracuda;
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER TABLE zcbus.bus_in_tables ADD INDEX idx_zcbus_QovbDnKMGG09GbI (fullTopic); ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
mysql> alter table zcbus.bus_in_tables ROW_FORMAT=DYNAMIC;
Query OK, 0 rows affected (0.20 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE zcbus.bus_in_tables ADD INDEX idx_zcbus_QovbDnKMGG09GbI (fullTopic);
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>

  • 系统变量innodb_large_prefix为ON

  • 系统变量innodb_file_format为Barracuda

  • ROW_FORMAT为DYNAMIC或COMPRESSED

show variables like '%innodb_large_prefix%';//查看是否开启
set global innodb_large_prefix=on;//如果没有开启设置开启
show variables like '%innodb_file_format%';//查看file格式
 set global innodb_file_format=Barracuda;//设置格式
 set global innodb_file_format_max=Barracuda;//设置格式
row_format=DYNAMIC或COMPRESSED ;//设置格式

如果启用了系统变量innodb_large_prefix(默认启用,注意实验版本为MySQL 5.6.41,默认是关闭的,MySQL 5.7默认开启),则对于使用DYNAMIC或COMPRESSED行格式的InnoDB表,索引键前缀限制为3072字节。如果禁用innodb_large_prefix,则对于任何行格式的表,索引键前缀限制为767字节。

innodb_large_prefix将在以后的版本中删除、弃用。在MySQL 5.5中引入了innodb_large_prefix,用来禁用大型前缀索引,以便与不支持大索引键前缀的早期版本的InnoDB兼容。
对于使用REDUNDANT或COMPACT行格式的InnoDB表,索引键前缀长度限制为767字节。例如,您可能会在TEXT或VARCHAR列上使用超过255个字符的列前缀索引达到此限制,假设为utf8mb3字符集,并且每个字符最多包含3个字节。

尝试使用超出限制的索引键前缀长度会返回错误。要避免复制配置中出现此类错误,请避免在主服务器上启用enableinnodb_large_prefix(如果无法在从服务器上启用)。

适用于索引键前缀的限制也适用于全列索引键。

注意:上面是767个字节,而不是字符,具体到字符数量,这就跟字符集有关。GBK是双字节的,UTF-8是三字节的

参考https://www.cnblogs.com/kerrycode/p/9680881.html

文档更新时间: 2020-12-28 14:39   作者:阿力