mysql5.6建立索引报错1709问题及解决 |
现象描述在给varchar字段建立索引时,报错如下:
查看表结构: CREATE TABLE `b` ( `name` varchar(250) DEFAULT NULL, `standardized_name` varchar(250) DEFAULT NULL, `is_reagent` int(11) NOT NULL DEFAULT '0', `is_solvent` int(11) NOT NULL DEFAULT '0', `is_catalyst` int(11) NOT NULL DEFAULT '0', `is_ligand` int(11) NOT NULL DEFAULT '0', `to_delete` int(11) DEFAULT '0', ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 原因分析索引字段的长度大于767,或者说,使用到的字段的长度和大于767则报错 。 MySQL 5.6 中的 在MySQL中, 这个参数控制是否允许使用超过767字节(或255个字符)的索引前缀 。 默认情况下,在MySQL 5.6及以前版本中,InnoDB存储引擎对索引列的最大长度限制为767字节 。 对于变长数据类型如VARCHAR,这个限制包括了字符集的每个字符可能占用的字节数,而不是仅仅指字符数 。 例如,如果你使用的是UTF-8字符集,每个字符可能占用1到4个字节,所以一个VARCHAR(255)字段的实际最大长度可能会远小于255个字符 。 当 这意味着你可以创建更长的索引,特别是对于包含大量变长数据类型的列 。 这对于处理大数据表和需要更复杂查询的情况非常有用 。 要启用 [mysqld] innodb_large_prefix = ON 或者,你可以在运行时通过设置全局变量来开启它: SET GLOBAL innodb_large_prefix = ON; 请注意,为了使
有关这些条件的详细信息,请参阅 MySQL 文档 。 问题处理set global innodb_large_prefix=on; show variables like 'innodb_large_prefix'; alter table b Row_format=dynamic; set global innodb_file_format=BARRACUDA; 再次加索引: [root@localhost:(test) 13:54:18]> CREATE INDEX b_name_IDX USING BTREE ON test.b(name); Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 总结以上为个人经验,希望能给大家一个参考,也希望大家多多支持 。 |