猿问

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

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

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

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

我怎么才能解决这个问题?

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


鸿蒙传说
浏览 836回答 3
3回答

holdtom

发生此错误是因为MySQL只能索引BLOB或TEXT列。因此,错误主要发生在TEXT或者那些属于TEXT或BLOB类型,如TINYBLOB, MEDIUMBLOB, LONGBLOB, TINYTEXT, MEDIUMTEXT,和LONGTEXT你试着做一个主键或索引。满足感BLOB或TEXT如果没有长度值,MySQL无法保证列的唯一性,因为它具有变量和动态大小。所以,当使用BLOB或TEXT类型作为索引,必须提供N的值,这样MySQL才能确定键长度。但是,MySQL不支持TEXT或BLOB. TEXT(88)根本没用。转换表列时,也会弹出该错误。non-TEXT和non-BLOB类型,如VARCHAR和ENUM进TEXT或BLOB类型,列已定义为唯一约束或索引。ALTERTABLE SQL命令将失败。问题的解决方案是删除TEXT或BLOB列来自索引或唯一约束,或将另一个字段设置为主键。如果您不能这样做,并且希望对TEXT或BLOB列,尝试使用VARCHAR键入并在其上设置长度限制。默认情况下,VARCHAR限制为最多255个字符,且其限制必须在其声明后的括号内隐式指定,即VARCHAR(200)将限制为200个字符的长度。有时,即使你不使用TEXT或BLOB相关类型在您的表中,错误1170也可能出现。它发生在一种情况下,例如当您指定VARCHAR列作为主键,但设置的长度或字符大小错误。VARCHAR只能接受最多256个字符,因此任何诸如VARCHAR(512)将迫使mysql自动转换VARCHAR(512)转到SMALLTEXTdataType,如果将列用作主键或唯一或非唯一索引,则数据类型将失败,从而导致键长度上的错误1170。若要解决此问题,请将小于256的数字指定为VARCHAR场。参考资料:MySQLError 1170(42000):键规范中使用的BLOB/Text列没有密钥长度

慕娘9325324

应该定义TEXT要索引的列。InnoDB有限制768每个索引键的字节数,您将不能创建一个比这更长的索引。这样做会很好:CREATE TABLE t_length (       mydata TEXT NOT NULL,       KEY ix_length_mydata (mydata(255)))     ENGINE=InnoDB;注意,键大小的最大值取决于列字符集。它是767单字节字符集的字符,如LATIN1而且只有255字符UTF8 (MySQL只使用BMP这最多需要3每个字符的字节)如果您需要整个专栏成为PRIMARY KEY,计算SHA1或MD5散列,并将其用作PRIMARY KEY.
随时随地看视频慕课网APP
我要回答