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

news/2024/7/7 14:35:50

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


http://www.niftyadmin.cn/n/2901002.html

相关文章

Linux platform平台总线、平台设备、平台驱动

平台总线(platform_bus)的需求来源? 随着soc的升级,S3C2440->S3C6410->S5PV210->4412,以前的程序就得重新写一遍,做着大量的重复工作, 人们为了提高效率,发现控制器的操作逻…

【js】如何用 js 把数据从一个页面传到另一个页面(sessionStorage.本地存储)

1、利用本地存储 通过相同的 key 完成本地数据的存入和读取,value 是要存和取的数据。 (key是随意起的,只要 存和取时 相同就行;) sessionStorage.setItem(“key”, “value”); // 存 sessionStorage.getItem(“key”…

linux下安装.run文件

2019独角兽企业重金招聘Python工程师标准>>> 比如realplay.run 安装方法如下 chmod x realplay.run ./realplay.run 然后他就会执行安装了,在过程中可能会要求你输入yes或no 安装完后就可以用了 ,chmod实际上是加权限命令 。+x表示可以执行ch…

读取Excel复杂的数据

涉及到合并单元格的数据读取: package com.util;import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStre…

【cmd】 如何通过cmd打开 jupyter,在jupyter中如何打开文件夹

前提是已经安装好了 1、通过 cmd 打开jupyter 在cmd中输入 jupyter notebook,等待片刻就会自动打开页面,也可以自己打开: http://localhost:8888 2、在jupyter中打开文件夹 在cmd 输入 jupyter notebook 之前 先输入文件夹所在的路径&#…

storm 基础知识点

STROM基础知识点1、 STROM基本概念2、 构建TOPOLOGY1) 实现目标实现对一个句子里面的单词出现的频率进行统计2) 设计TOPOLOGY结构开发STROM项目的第一步3) 设计数据流4) 代码实现5) 运行TOPOLOGY3、 TOPOLOGY并…

Codeforces 879C/878A - Short Program

传送门:http://codeforces.com/contest/879/problem/C 本题是一个位运算问题——位运算的等价变换。 假设位运算符“&”“|”“^”是左结合的,且优先级相同,则一个表达式:“xa[1]a[2]...a[n]”,等价于“(...((xa[1…

app_item_property.SET_PROPERTY与set_item_property有什么区别?

尽量使用APP_ITEM_PROPERTY.SET_PROPERTY和APP_ITEM_PROPERTY.SET_VISUAL_ATTRIBUTE代替SET_ITEM_PROPERTYset_item_property是form builder带的。app_item_property.SET_PROPERTY是oracle公司为ebs开发的包,底层还是调用set_item_property. APP_ITEM_PROPERTY.SET…