我有一个主键为 varchar(255) 的表。在某些情况下,255 个字符是不够的。我尝试将字段更改为文本,但出现以下错误:
BLOB/TEXT column 'message_id' used in key specification without a key length
我怎样才能解决这个问题?
编辑:我还应该指出该表有一个包含多个列的复合主键。
发生该错误的原因是 MySQL 只能索引 BLOB 的前 N 个字符或TEXT
柱子。所以错误主要发生在字段/列类型为TEXT
或 BLOB 或属于TEXT
or BLOB
类型如TINYBLOB
, MEDIUMBLOB
, LONGBLOB
, TINYTEXT
, MEDIUMTEXT
, and LONGTEXT
您尝试创建主键或索引。与满BLOB
or TEXT
如果没有长度值,MySQL 无法保证列的唯一性,因为它的大小是可变的和动态的。所以,当使用BLOB
or TEXT
类型作为索引,必须提供 N 的值,以便 MySQL 可以确定键长度。但是,MySQL 不支持密钥长度限制TEXT
or BLOB
. TEXT(88)
根本行不通。
当您尝试将表列从non-TEXT
and non-BLOB
类型如VARCHAR
and ENUM
into TEXT
or BLOB
类型,列已定义为唯一约束或索引。 Alter Table SQL 命令将失败。
解决问题的方法是删除TEXT
or BLOB
索引或唯一约束中的列或将另一个字段设置为主键。如果你做不到这一点,并且想要限制TEXT
or BLOB
列,尝试使用VARCHAR
键入并对其设置长度限制。默认情况下,VARCHAR
限制为最多 255 个字符,并且其限制必须在声明后的括号内隐式指定,即VARCHAR(200)
将其长度限制为 200 个字符。
有时,即使你不使用TEXT
or BLOB
表中的相关类型,也可能会出现错误 1170。它发生在诸如当您指定的情况下VARCHAR
列作为主键,但错误地设置了其长度或字符大小。VARCHAR
最多只能接受 256 个字符,因此诸如VARCHAR(512)
将强制 MySQL 自动转换VARCHAR(512)
to a SMALLTEXT
datatype,如果该列用作主键或唯一或非唯一索引,则随后会失败并出现键长度错误 1170。为了解决这个问题,指定一个小于256的数字作为大小VARCHAR
field.
参考:MySQL 错误 1170 (42000):在没有密钥长度的密钥规范中使用 BLOB/TEXT 列 https://web.archive.org/web/20071012020606/http://www.mydigitallife.info/2007/07/09/mysql-error-1170-42000-blobtext-column-used-in-key-specification-without-a-key-length/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)