我有一个主键为varchar(255)的表.有些情况下,255个字符不够.我try 将字段更改为文本,但出现以下错误:
BLOB/TEXT column 'message_id' used in key specification without a key length
我该怎么解决这个问题?
编辑:我还应该指出,这个表有一个包含多个列的复合主键.
我有一个主键为varchar(255)的表.有些情况下,255个字符不够.我try 将字段更改为文本,但出现以下错误:
BLOB/TEXT column 'message_id' used in key specification without a key length
我该怎么解决这个问题?
编辑:我还应该指出,这个表有一个包含多个列的复合主键.
之所以会出现这种错误,是因为MySQL只能索引BLOB或TEXT
列的前N个字符.因此,错误主要发生在字段/列类型为TEXT
或BLOB,或者那些属于TEXT
或BLOB
类型的字段/列,例如TINYBLOB
、MEDIUMBLOB
、LONGBLOB
、TINYTEXT
、MEDIUMTEXT
和LONGTEXT
,您试图创建主键或索引时.对于没有长度值的full BLOB
或TEXT
,MySQL无法保证列的唯一性,因为它的大小是可变的和动态的.因此,当使用BLOB
或TEXT
个类型作为索引时,必须提供N的值,以便MySQL可以确定密钥长度.然而,MySQL不支持密钥长度限制为TEXT
或BLOB
.这根本行不通.
当您试图将表列从non-TEXT
和non-BLOB
类型(如VARCHAR
和ENUM
)转换为TEXT
或BLOB
类型时,该错误也会弹出,该列已被定义为唯一约束或索引.Alter Table SQL命令将失败.
该问题的解决方案是从索引或唯一约束中删除TEXT
或BLOB
列,或者将另一个字段设置为主键.如果你做不到这一点,并且想要对TEXT
或BLOB
列进行限制,那么try 使用VARCHAR
类型并对其进行长度限制.默认情况下,VARCHAR
的最大长度限制为255个字符,其限制必须在声明后的括号内隐式指定,即VARCHAR(200)
将其长度限制为200个字符.
有时,即使在表中没有使用TEXT
或BLOB
相关类型,也可能会出现错误1170.这种情况下会发生,例如指定VARCHAR
列作为主键,但错误地设置了其长度或字符大小.VARCHAR
最多只能接受256个字符,因此,像VARCHAR(512)
这样的任何内容都会迫使MySQL将VARCHAR(512)
自动转换为SMALLTEXT
数据类型,如果列用作主键或唯一或非唯一索引,则随后会失败,键长度出现错误1170.要解决此问题,请指定一个小于256的数字作为VARCHAR
字段的大小.
参考:MySQL Error 1170 (42000): BLOB/TEXT Column Used in Key Specification Without a Key Length