为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

鸿蒙传说 2019-07-11 16:09:46
MySQL错误:没有密钥长度的密钥规范我有一个表,它的主键是varchar(255)。有些情况下,255个字符是不够的。我尝试将字段更改为文本,但得到了以下错误:BLOB/TEXT column 'message_id' used in key specification without a key length我怎么才能解决这个问题?编辑:我还应该指出,这个表有一个包含多列的复合主键。
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

发生此错误是因为MySQL只能索引BLOB或TEXT列。因此,错误主要发生在TEXT或者那些属于TEXTBLOB类型,如TINYBLOBMEDIUMBLOBLONGBLOBTINYTEXTMEDIUMTEXT,和LONGTEXT你试着做一个主键或索引。满足感BLOBTEXT如果没有长度值,MySQL无法保证列的唯一性,因为它具有变量和动态大小。所以,当使用BLOBTEXT类型作为索引,必须提供N的值,这样MySQL才能确定键长度。但是,MySQL不支持TEXTBLOBTEXT(88)根本没用。

转换表列时,也会弹出该错误。non-TEXTnon-BLOB类型,如VARCHARENUMTEXTBLOB类型,列已定义为唯一约束或索引。ALTERTABLE SQL命令将失败。

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

有时,即使你不使用TEXTBLOB相关类型在您的表中,错误1170也可能出现。它发生在一种情况下,例如当您指定VARCHAR列作为主键,但设置的长度或字符大小错误。VARCHAR只能接受最多256个字符,因此任何诸如VARCHAR(512)将迫使mysql自动转换VARCHAR(512)转到SMALLTEXTdataType,如果将列用作主键或唯一或非唯一索引,则数据类型将失败,从而导致键长度上的错误1170。若要解决此问题,请将小于256的数字指定为VARCHAR场。

参考资料:MySQLError 1170(42000):键规范中使用的BLOB/Text列没有密钥长度


查看完整回答
反对 回复 2019-07-11
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

应该定义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,计算SHA1MD5散列,并将其用作PRIMARY KEY.


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 835 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信