MySQL错误:没有键长度的键规范。
MySQL错误:没有键长度的键规范。
我有一张表,它的主键是一个varchar(255)。一些情况出现,255个字符不够用。我尝试将字段更改为文本,但出现以下错误:
BLOB/TEXT column 'message_id' used in key specification without a key length
我该如何解决这个问题?
编辑:我还应该指出,这个表具有多列的复合主键。
您应该定义想要索引的TEXT
列的前导部分。
InnoDB
每个索引键的限制为768
字节,您无法创建比此更长的索引。
这将正常工作:
CREATE TABLE t_length ( mydata TEXT NOT NULL, KEY ix_length_mydata (mydata(255))) ENGINE=InnoDB;
请注意,键大小的最大值取决于列字符集。对于单字节字符集如LATIN1
,最大字符数为767
,对于UTF8
则只有255
个字符(MySQL
仅使用最多每个字符3
个字节的BMP
)。
如果您需要整个列成为PRIMARY KEY
,请计算SHA1
或MD5
哈希,并将其用作PRIMARY KEY
。
错误是因为MySQL只能索引BLOB或TEXT列的前N个字符。 因此,当有字段/列类型为TEXT或BLOB或属于TEXT或BLOB类型,例如TINYBLOB,MEDIUMBLOB,LONGBLOB,TINYTEXT,MEDIUMTEXT和LONGTEXT时,您尝试将其作为主键或索引时,主要会出现错误。对于完整的BLOB或TEXT列(没有长度值),由于其大小是可变的和动态的,MySQL无法保证列的唯一性。因此,当将BLOB或TEXT类型用作索引时,必须提供N的值,以使MySQL确定键长度。但是,MySQL不支持在TEXT或BLOB上设置键长度限制。简单地说,TEXT(88)无法使用。
当您尝试将表列从非TEXT和非BLOB类型(例如VARCHAR和ENUM)转换为TEXT或BLOB类型时,并且该列已定义为唯一约束或索引时,错误也会弹出。 Alter Table SQL命令将失败。
解决问题的方法是从索引或唯一约束中删除TEXT或BLOB列,或设置另一个字段作为主键。如果无法执行此操作,并且想对TEXT或BLOB列设置限制,请尝试使用VARCHAR类型并在其上设置长度限制。默认情况下,VARCHAR仅限于最多255个字符,并且其限制必须在声明后的括号中隐式指定,即VARCHAR(200)仅将其限制为200个字符长。
有时,即使在表中不使用TEXT或BLOB相关类型,错误1170也可能出现。这种情况发生在您将VARCHAR列指定为主键,但错误地设置其长度或字符大小时。VARCHAR仅接受最多256个字符,因此任何如VARCHAR(512)之类的东西都将强制MySQL将VARCHAR(512)自动转换为SMALLTEXT数据类型,如果该列用作主键或唯一的或非唯一的索引,则会随后导致错误1170的键长度。要解决此问题,请为VARCHAR字段指定小于256的数字大小。
参考:MySQL错误1170(42000):在键规范中使用的BLOB / TEXT列没有键长度