MySQL错误: key specification without a key length

标签 mysql sql mysql-error-1170

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

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

我该如何解决这个问题?

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

最佳答案

发生此错误的原因是 MySQL 只能索引 BLOB 或 TEXT 列的前 N ​​个字符。因此,该错误主要发生在存在 TEXT 或 BLOB 类型的字段/列或属于 TEXTBLOB 类型(例如 >TINYBLOBMEDIUMBLOBLONGBLOBTINYTEXTMEDIUMTEXTLONGTEXT code> 您尝试创建主键或索引。对于没有长度值的完整BLOBTEXT,MySQL无法保证列的唯一性,因为它的大小是可变的和动态的。因此,当使用BLOBTEXT类型作为索引时,必须提供N的值,以便MySQL可以确定键长度。但是,MySQL 不支持 TEXTBLOB 的 key 长度限制。 TEXT(88) 根本行不通。

当您尝试将表列从非TEXT非BLOB类型(例如VARCHAR)转换时,也会弹出该错误和 ENUM 转换为 TEXTBLOB 类型,其中列已定义为唯一约束或索引。 Alter Table SQL 命令将失败。

问题的解决方案是从索引或唯一约束中删除 TEXTBLOB 列,或者将其他字段设置为主键。如果您无法做到这一点,并且想要对 TEXTBLOB 列施加限制,请尝试使用 VARCHAR 类型并放置一个其长度限制。默认情况下,VARCHAR 的最大长度限制为 255 个字符,并且必须在声明后的方括号内隐式指定其限制,即 VARCHAR(200) 将其限制为仅 200 个字符长。

有时,即使您在表中没有使用 TEXTBLOB 相关类型,也可能会出现错误 1170。它发生在以下情况:您指定 VARCHAR 列作为主键,但错误地设置了其长度或字符大小。 VARCHAR 最多只能接受 256 个字符,因此诸如 VARCHAR(512) 之类的任何内容都会强制 MySQL 自动转换 VARCHAR(512)转换为 SMALLTEXT 数据类型,如果该列用作主键或唯一或非唯一索引,该数据类型随后会失败并出现键长度错误 1170。要解决此问题,请将 VARCHAR 字段的大小指定为小于 256 的数字。

引用:MySQL Error 1170 (42000): BLOB/TEXT Column Used in Key Specification Without a Key Length

关于MySQL错误: key specification without a key length,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37140620/

相关文章:

mysql - 使用连接简化 mysql 查询

php - 如何将不同部分的用户统计信息存储在数据库(mysql)中?

mysql - SQL - 在按优先级设置的值中选择第一个?

mysql - 将索引应用于 Blob/长文本字段

MySQL 全文索引与 Rails 2.3.2(迁移问题)

mysql - 尝试在 xampp 服务器中导入 SQL 文件会返回错误

mysql - 如何从数据库中删除重复项?

mysql - 对两行求和并按日期/总计排序

sql - 如何在 SQL 中进行数据重组