MySQL错误:没有键长度的键规范。

14 浏览
0 Comments

MySQL错误:没有键长度的键规范。

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

BLOB/TEXT column 'message_id' used in key specification without a key length

我该如何解决这个问题?

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

admin 更改状态以发布 2023年5月20日
0
0 Comments

您应该定义想要索引的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,请计算SHA1MD5哈希,并将其用作PRIMARY KEY

0
0 Comments

错误是因为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列没有键长度

0