添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

mysql出错提示“BLOB/TEXT column used in key specification without a key length”解决办法

pandas对象将DataFrame数据保存到mysql中时,出现错误提示:
BLOB/TEXT column used in key specification without a key length

在MySQL数据库中,当MySQL创建新表或者更改已存在表,这个表存在主键,并且是unique唯一性约束和索引约束时,或者是在定义一个索引来更改数据表的text字段操作语句的时候,下面的错误信息很可能会出现,并且经过当前操作命令的完成。错误信息为BLOB或者TEXT字段使用了未指定键值长度的键,发生了这样的错误:BLOB/TEXT column 'name' used in key specification without a key length。

查阅资料后才知道,原来Mysql数据库对于BLOB/TEXT这样类型的数据结构只能索引前N个字符。所以这样的数据类型不能作为主键,也不能是UNIQUE的。所以要换成VARCHAR,但是VARCHAR类型的大小也不能大于255,当VARCHAR类型的字段大小如果大于255的时候也会转换成小的TEXT来处理。所以也同样有问题。

此外,因为MySQL只能将BLOB/TEXT类型字段设置索引为BLOB/TEXT数据的钱N个字符,因此错误常常发生在字段被定义为TEXT/BLOB类型或者和TEXT/BLOB同质的数据类型,如TINYTEXT,MEDIUMTEXT,LONGTEXT ,TINYBLOB,MEDIUMBLOB 和LONGBLOB,并且当前操作是将这个字段设置成主键或者是索引的操作。在未指定TEXT/BLOB‘键长’的情况下,字段是变动的并且是动态的大小所以MySQL不能够保证字段的唯一性。因此当使用TEXT/BLOB类型字段做为索引时,N的值必须提供出来才可以让MySQL决定键长,但是MySQL不支持在TEXT/BLOB限制,TEXT(88)是不行的。

当你试图将数据表中的一个非TEXT或者非BLOB类型如VARCHAR或ENUM的字段转换成TEXT/BLOB,同时这个字段已经被定义了unique限制或者是索引,这个错误也会弹出,并且更改数据表的命令会执行失败

出问题的原因是DataFrame对象索引的数据类型是TEXT/BLOB或其从属的类型,当将其作为mysql中的主键的时候,如果这些数据类型缺少明确的长度值,mysql无法保证主键的唯一性,因为这个主键是一个变量,其长度是动态的。所以当使用 TEXT/BLOB类型的数据作为索引的时候,数据的长度必须提供给mysql,使其能够明确键的长度。但是mysql不支持对TEXT/BLOB长度的限制。

同样的错误也会出现在试图将非TEXT/BLOB类型的数据列转换成TEXT/BLOB类型,这些列被定义成独立的索引。AlterTable命令会失效。

三、解决方法

解决方案是将unique限制和索引从TEXT/BLOB字段中移除,或者是设置另一个字段为主键。如果不得不设置成主键,而想限制TEXT/BLOB的长度,可以尝试使用VARCHAR并设置其长度。VARCHAR默认长度是255个字符,并且其长度必须在其声明之后的右边括号中设置,例如,VARCHAR(200)将其设置成200个字符长度。

有时候,即使你在数据表中不使用TEXT/BLOB类型或者同质类型,error1170 也会出现,这个问题出现在当你设置一个VARCHAR字段为主键,但是却错误的设置了长度或者字符数,事实上,VARCHAR只能接受最大为256个字符串,但是你错误的设置成VARCHAR(512)等一些错误的设置,这些错误的设置会强制MySQL自动将VARCHAR(512)等转换成SMALLINT类型,同时这个字段被设置成primary key ,unique限制或者index索引等,然后执行操作就出现error 1170错误,解决问题的方法,为VARCHAR域指定小于256的长度。

mysql #1170错误(42000) BLOB/TEXT Column Used in Key Specification Without a Key Length

将DataFrame数据输出到mysql时强制将索引转换成VARCHAR并限制其长度,其中的code是索引的标签:

1 data.to_sql('data',engine,if_exists='replace',dtype={'code':VARCHAR(data.index.get_level_values('code').str.len().max())})

参考:https://www.cnblogs.com/zhangjpn/p/6133793.html

https://blog.csdn.net/u012069924/article/details/28858337

mysql出错提示“BLOB/TEXT column used in key specification without a key length”解决办法一、问题pandas对象将DataFrame数据保存到mysql中时,出现错误提示:  BLOB/TEXT column used in key specification without a key length或者    ...
转帖自:http://www.sharkuo.com/ BLOB - TEXT - column -cannot-have-a-default-value-queryCreate table的时候,报错 BLOB / TEXT column 'xxxxxx(表名称)' can't have a default value query ,意思是 TEXT 类型的表字段不能够有默认值。搜索到很多解决方案都是将descript ion TEXT DEFAULT 'www.sharkuo.com', 改为 descript ion TEX
一、 TEXT BLOB 的区别 TEXT BLOB 家族之间仅有的不同是 BLOB 类型存储的是二进制数据,没有排序规则或字符集,而 TEXT 类型有字符集或排序规则。说白了如果要储存中文则选择 TEXT 。 二、默认值问题 Strict Mode下不能设置默认值,否则会报can’t have a default value错: mysql > create table `test`.` text _ blob `( -> `a_ text ` text DEFAULT ' ' , -> `b_ blob ` blob ERROR 1101 (42000): BLOB / TEXT column 'a_tex
pandas对象保存到 mysql 出错 提示 BLOB / TEXT column u sed in key specifi cat ion without a key length 解决办法
首先是数据库建立要准备的: 我们要把放置二进制字段设置为 Blob 类型,根据文件的大小选择合适的 Blob 类型,一下是各个 Blob 类型所能容纳二进制文件的大小 MySQL 的四种 BLOB 类型 类型 大小(单位:字节) Tiny Blob 最大 255 Blob 最大 65K Medium Blob 最大 16M Long Blob 最大 4G 一下是具体 操作 代码: 代码如下:/** * * 把二进制文件(该二进制文件可以是本地硬盘路径,也可以是一个网络路径)存入数据库 * create date:2009-5-13 author:Administrator * * @param file * 可以是本地
本文实例讲述了PHP 操作 MySQL BLOB 字段的方法。分享给大家供大家参考,具体如下: 1、 MySQL BLOB 字段类型 BLOB 类型的字段用于存储二进制数据。 MySQL 中, BLOB 是个类型系列,包括:Tiny Blob Blob 、Medium Blob 、Long Blob ,这几个类型之间的唯一区别是在存储文件的最大大小上不同。 MySQL 的四种 BLOB 类型 Tiny Blob :  最大 255字节 Blob :      最大 65K Medium Blob :最大 16M Long Blob :  最大 4G 注意:如果你存储的文件过大,数据库的性能会下降很多。 2、PHP 操作 BLOB 案例 (1) 操作