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

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

我该怎么解决这个问题?

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

推荐答案

之所以会出现这种错误,是因为MySQL只能索引BLOB或TEXT列的前N个字符.因此,错误主要发生在字段/列类型为TEXT或BLOB,或者那些属于TEXTBLOB类型的字段/列,例如TINYBLOBMEDIUMBLOBLONGBLOBTINYTEXTMEDIUMTEXTLONGTEXT,您试图创建主键或索引时.对于没有长度值的full BLOBTEXT,MySQL无法保证列的唯一性,因为它的大小是可变的和动态的.因此,当使用BLOBTEXT个类型作为索引时,必须提供N的值,以便MySQL可以确定密钥长度.然而,MySQL不支持密钥长度限制为TEXTBLOB.这根本行不通.

当您试图将表列从non-TEXTnon-BLOB类型(如VARCHARENUM)转换为TEXTBLOB类型时,该错误也会弹出,该列已被定义为唯一约束或索引.Alter Table SQL命令将失败.

该问题的解决方案是从索引或唯一约束中删除TEXTBLOB列,或者将另一个字段设置为主键.如果你做不到这一点,并且想要对TEXTBLOB列进行限制,那么try 使用VARCHAR类型并对其进行长度限制.默认情况下,VARCHAR的最大长度限制为255个字符,其限制必须在声明后的括号内隐式指定,即VARCHAR(200)将其长度限制为200个字符.

有时,即使在表中没有使用TEXTBLOB相关类型,也可能会出现错误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

Mysql相关问答推荐

在SQL中,为什么:=即使条件为False,也会在case声明中执行?我如何修复这个问题?

正在获取MySQL死锁,因为这个查询需要很长时间.

根据上一行S列结果计算列的查询

如何使用GROUP BY调优简单SQL查询

Mysql-查找缺少列的表

docker-compose:无法将应用程序服务连接到 mysql 数据库,收到错误:用户‘root’@‘localhost’访问被拒绝(使用密码:YES)

Group_CONCAT CASE 乘法输出

按特定顺序匹配 EventS 和下一个 EventA 之前的第一个 Event 之间的记录

替代对多个表执行 FULL OUTER JOIN?

MYSQL 删除两个已知字符串之间的字符串

MySql部分匹配基于部分查询代码

如何在任何连续范围内获得最大值

MYSQL 或 Laravel Eloquent 如何从这个订单中统计细节

为什么 ORDER BY 'id' 'desc' 不返回语法错误?

有没有办法在 Zend Framework 1.5 中执行INSERT...ON DUPLICATE KEY UPDATE?

MySQL行格式:固定和动态之间的区别?

MySQL - 基于同一表中的行求和列值

启用 NO_BACKSLASH_ESCAPES 选项时如何转义文字百分号?

在 Postgresql 中模拟 MySQL 的 ORDER BY FIELD()

应该使用什么列类型将序列化数据存储在 mysql 数据库中?