我有一个主键为varchar(255)的表。有些情况下,255个字符不够。我尝试将字段更改为文本,但出现以下错误:
BLOB/TEXT列“message\u id”在密钥规范中使用,没有密钥长度
我怎样才能解决这个问题
编辑:我还应该指出,这个表有一个包含多个列的复合主键
之所以发生此错误,是因为MySQL只能索引BLOB或TEXT列的前N个字符。因此,错误主要发生在存在TEXT或BLOB的字段/列类型,或属于TEXT或BLOB类型的字段/列类型时,例如TINYBLOB,MEDIUMBLOB,LONGBLOB,TINYTEXT,MEDIUMTEXT,和LONGTEXT,您尝试创建主键或索引。如果fullBLOB或TEXT没有长度值,MySQL无法保证列的唯一性,因为它的大小是可变的和动态的。因此,当使用BLOB或TEXT类型作为索引时,必须提供N值,以便MySQL可以确定密钥长度。但是,MySQL不支持对TEXT或BLOB的键长度限制文本(88)根本不起作用
当您尝试将表列从非文本和非BLOB类型(如VARCHAR和ENUM转换为文本或BLOB类型)时,也会弹出错误,并且列已定义为唯一约束或索引。ALTERTABLESQL命令将失败
该问题的解决方案是从索引或唯一约束中删除TEXT或BLOB列,或将另一个字段设置为主键。如果您无法做到这一点,并且希望对TEXT或BLOB列设置限制,请尝试使用VARCHAR键入并对其设置长度限制。默认情况下,VARCHAR的最大长度限制为255个字符,其限制必须在声明后的括号内隐式指定,即VARCHAR(200)将其长度限制为200个字符
有时,即使您没有在表中使用TEXT或BLOB相关类型,也可能会出现错误1170。它发生在这样一种情况下:指定VARCHAR列作为主键,但错误地设置了其长度或字符大小VARCHAR最多只能接受256个字符,因此任何诸如VARCHAR(512)之类的操作都会强制MySQL将VARCHAR(512)自动转换为SMALLTEXT数据类型,如果该列用作主键或唯一或非唯一索引,则随后将失败,键长度出现错误1170。要解决此问题,请指定小于256的数字作为VARCHAR字段的大小
参考:MySQL错误1170(42000):键规范中使用的BLOB/TEXT列没有键长度