1.背景
在MySQL数据库中,当我们创建新表或者更改一个已有主键的表,并且是 unique 唯一性约束和索引约束时,或用 Alter Table 操作语句定义一个新的索引时,MySQL 可能会出现 ERROR 1170。
ERROR 1170 (42000): BLOB/TEXT column ‘field_name’ used in key specification without a key length
2.原因
1170 错误的原因是因为 MySQL 只能索引 BLOB
或 TEXT
字段的前 N 个字符。因此这个错误主要发生在 TEXT
或 BLOB
类型的字段或一些属于 TEXT
或 BLOB
类型的字段中,比如 TINYTEXT
,MEDIUMTEXT
,LONGTEXT
,TINYBLOB
,MEDIUMBLOB
和 LONGBLOB
这些类型中。
当我们开始对以上这些类型的字段设置成主键或者进行 index 索引时,会出现这种错误。
对于未指定 BLOB / TEXT
「键长」的情况下,MySQL 无法保证字段的唯一性,因为它们是动态的,可变化的。因此,当使用 BLOB / TEXT
类型作为索引时,必须提供 N 的值,以便 MySQL 能够确定键的长度。但是 MySQL 不支持对 BLOB / TEXT
的限制。TEXT(77)
这么设置是不行的。
当你尝试把非 BLOB / TEXT
类型的字段(比如 VARCHAR
和 ENUM
)转换成 BLOB / TEXT
类型,同时定义这个字段为 Unique 限制或 index 索引时。MySQL 也会报 1170 错误。执行的这条更改 SQL 也会操作失败。
3.解决
将unique限制和索引从TEXT/BLOB字段中移除,或者是设置另一个字段为主键,如果你不愿意这样做并且想在TEXT/BLOB上加限制,那么你可以尝试将这个字段更改为VARCHAR类型,同时给他一个限制长度,默认VARCHAR最多可以限定在255个字符,并且限制要在声明类型的右边指明,如VARCHAR(200)将会限制仅仅200个字符