本篇内容介绍了“怎么解决数据库ERROR 1071 (42000)报错问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

今天在对一张表加索引时候出现如下报错:

mysql>ALTERTABLEym_sys_dictADDINDEXidx_dcode_dvalue(`dict_code`,`dict_value`);ERROR1071(42000):Specifiedkeywastoolong;maxkeylengthis767bytes

查阅文档时候,看到如下解释:

"ForCHAR,VARCHAR,BINARY,andVARBINARYcolumns,indexescanbecreatedthatuseonlytheleadingpartofcolumnvalues,usingcol_name(length)syntaxtospecifyanindexprefixlength....Prefixescanbeupto1000byteslong(767bytesforInnoDBtables).Notethatprefixlimitsaremeasuredinbytes,whereastheprefixlengthinCREATETABLEstatementsisinterpretedasnumberofcharacters...">>>对于myisam和innodb存储引擎,prefixes的长度限制分别为1000bytes和767bytes。注意prefix的单位是bytes,但是建表时我们指定的长度单位是字符。Autf8charactercanuseupto3bytes.Henceyoucannotindexcolumnsorprefixesofcolumnslongerthan333(MyISAM)or255(InnoDB)utf8characters.>>以utf8字符集为例,一个字符占3个bytes。因此在utf8字符集下,对myisam和innodb存储引擎创建索引的单列长度不能超过333个字符和255个字符

mysql索引长度限制:

1)单列索引:

mysql 在创建单列索引的时候对列的长度是有限制的 myisam和innodb存储引擎下长度限制分别为1000 bytes和767 bytes。(注意bytes和character的区别)

2) 组合索引:

对于innodb存储引擎,多列索引的长度限制如下:每个列的长度不能大于767 bytes;所有组成索引列的长度和不能大于3072 bytes

smallint 占2个bytes,timestamp占4个bytes,utf8字符集。utf8字符集下,一个character占三个byte。

对于这个问题,解决方法有两个:

1)修改参数innodb_large_prefix,该参数默认为OFF,修改为ON

mysql>showvariableslike'innodb_large_prefix';+---------------------+-------+|Variable_name|Value|+---------------------+-------+|innodb_large_prefix|OFF|+---------------------+-------+

2)修改字段长度

查看表结构:

mysql>showcreatetableym_sys_dict\G***************************1.row***************************Table:ym_sys_dictCreateTable:CREATETABLE`ym_sys_dict`(`id`int(20)NOTNULLAUTO_INCREMENT,`dict_name`varchar(100)NOTNULLCOMMENT'字典名称',`dict_type`varchar(100)NOTNULLCOMMENT'字典类型',`dict_code`varchar(100)CHARACTERSETutf8COLLATEutf8_binDEFAULTNULL,`dict_value`varchar(1000)DEFAULTNULL,`order_num`int(11)DEFAULT'0'COMMENT'排序',`remark`varchar(255)DEFAULT''COMMENT'备注',`del_flag`tinyint(4)DEFAULT'0'COMMENT'删除标记-1:已删除0:正常',PRIMARYKEY(`id`),UNIQUEKEY`dict_type`(`dict_type`,`dict_code`))ENGINE=InnoDBAUTO_INCREMENT=93DEFAULTCHARSET=utf8COMMENT='数据字典表'

经和开发沟通,dict_value字段长度设置过长,改字段长度为100

altertableym_sys_dictmodifydict_valuevarchar(100);

然后可以正常添加索引

mysql>ALTERTABLEym_sys_dictADDINDEXidx_dcode_dvalue(`dict_code`,`dict_value`);QueryOK,0rowsaffected(0.01sec)Records:0Duplicates:0Warnings:0

“怎么解决数据库ERROR 1071 (42000)报错问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!