MySQL错误:没有密钥长度的密钥规范

我有一个主键为varchar(255)的表。有些情况下,255个字符不够。我尝试将字段更改为文本,但出现以下错误:

BLOB/TEXT列“message\u id”在密钥规范中使用,没有密钥长度

我怎样才能解决这个问题

编辑:我还应该指出,这个表有一个包含多个列的复合主键

之所以发生此错误,是因为MySQL只能索引BLOB或TEXT列的前N个字符。因此,错误主要发生在存在TEXT或BLOB的字段/列类型,或属于TEXTBLOB类型的字段/列类型时,例如TINYBLOBMEDIUMBLOBLONGBLOBTINYTEXTMEDIUMTEXT,和LONGTEXT,您尝试创建主键或索引。如果fullBLOBTEXT没有长度值,MySQL无法保证列的唯一性,因为它的大小是可变的和动态的。因此,当使用BLOBTEXT类型作为索引时,必须提供N值,以便MySQL可以确定密钥长度。但是,MySQL不支持对TEXTBLOB的键长度限制文本(88)根本不起作用

当您尝试将表列从非文本非BLOB类型(如VARCHARENUM转换为文本BLOB类型)时,也会弹出错误,并且列已定义为唯一约束或索引。ALTERTABLESQL命令将失败

该问题的解决方案是从索引或唯一约束中删除TEXTBLOB列,或将另一个字段设置为主键。如果您无法做到这一点,并且希望对TEXTBLOB列设置限制,请尝试使用VARCHAR键入并对其设置长度限制。默认情况下,VARCHAR的最大长度限制为255个字符,其限制必须在声明后的括号内隐式指定,即VARCHAR(200)将其长度限制为200个字符

有时,即使您没有在表中使用TEXTBLOB相关类型,也可能会出现错误1170。它发生在这样一种情况下:指定VARCHAR列作为主键,但错误地设置了其长度或字符大小VARCHAR最多只能接受256个字符,因此任何诸如VARCHAR(512)之类的操作都会强制MySQL将VARCHAR(512)自动转换为SMALLTEXT数据类型,如果该列用作主键或唯一或非唯一索引,则随后将失败,键长度出现错误1170。要解决此问题,请指定小于256的数字作为VARCHAR字段的大小

参考:MySQL错误1170(42000):键规范中使用的BLOB/TEXT列没有键长度

发表评论