ERROR 1406 (22001): Data Too Long, field len 30, data len 48
今天遇到一个保持问题比较诡异:
执行sql语句insert into test.COLUMNS select * from information_schema.COLUMNS;报错:ERROR 1406 (22001): Data Too Long, field len 30, data len 48
问题的背景大概是这样子:
1、TiDB4.0分布式数据库系统,去information_schema.TABLES copy一份表结构,然后建一个一模一样的空表到一个临时库csdn上面。
2、在tidb的命令行里面执行 insert into test.COLUMNS select * from information_schema.COLUMNS;
3、尝试mysqldump从information_schema的TABLES表里面导出数据,导入到csdn库上的TABLES表里面去,还是报错。
4、检查了两个库information_schema和csdn库,表结构都是一样的。
看报错,应该是字段只有30的长度,但是录入的数据缺有48个字符串,那么就再仔细检查表结构
CREATE TABLE `TABLES` (`TABLE_CATALOG` varchar(512) DEFAULT NULL,`TABLE_SCHEMA` varchar(64) DEFAULT NULL,`TABLE_NAME` varchar(64) DEFAULT NULL,`COLUMN_NAME` varchar(64) DEFAULT NULL,`ORDINAL_POSITION` bigint(64) DEFAULT NULL,`COLUMN_DEFAULT` text DEFAULT NULL,`IS_NULLABLE` varchar(3) DEFAULT NULL,`DATA_TYPE` varchar(64) DEFAULT NULL,`CHARACTER_MAXIMUM_LENGTH` bigint(21) DEFAULT NULL,`CHARACTER_OCTET_LENGTH` bigint(21) DEFAULT NULL,`NUMERIC_PRECISION` bigint(21) DEFAULT NULL,`NUMERIC_SCALE` bigint(21) DEFAULT NULL,`DATETIME_PRECISION` bigint(21) DEFAULT NULL,`CHARACTER_SET_NAME` varchar(32) DEFAULT NULL,`COLLATION_NAME` varchar(32) DEFAULT NULL,`COLUMN_TYPE` text DEFAULT NULL,`COLUMN_KEY` varchar(3) DEFAULT NULL,`EXTRA` varchar(30) DEFAULT NULL,`PRIVILEGES` varchar(80) DEFAULT NULL,`COLUMN_COMMENT` varchar(1024) DEFAULT NULL,`GENERATION_EXPRESSION` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
看到有一个字段EXTRA是`EXTRA` varchar(30) DEFAULT NULL,那么就去检查下这个字段里面的数据的值,是否有超过的。
mysql-17:31:41> select length(EXTRA) l,EXTRA from information_schema.TABLES order by l desc limit 50;
+----+--------------------------------------------------+
| l | EXTRA |
+----+--------------------------------------------------+
| 48 | DEFAULT_GENERATED on update CURRENT_TIMESTAMP(3) |
| 48 | DEFAULT_GENERATED on update CURRENT_TIMESTAMP(3) |
| 48 | DEFAULT_GENERATED on update CURRENT_TIMESTAMP(3) |
| 48 | DEFAULT_GENERATED on update CURRENT_TIMESTAMP(3) |
| 48 | DEFAULT_GENERATED on update CURRENT_TIMESTAMP(3) |
| 48 | DEFAULT_GENERATED on update CURRENT_TIMESTAMP(3) |
| 48 | DEFAULT_GENERATED on update CURRENT_TIMESTAMP(3) |
| 48 | DEFAULT_GENERATED on update CURRENT_TIMESTAMP(3) |
检查得到length(extra),确实最大长度是48,难道是字符集的原因吗,因为类似mysql的数据库里面,字符集不一样,占据空间是不一样的。
先看库的字符集,是一样的:
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| csdn | CREATE DATABASE `csdn` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+------------------------------------------------------------------++--------------------+--------------------------------------------------------------------------------+
| Database | Create Database |
+--------------------+--------------------------------------------------------------------------------+
| INFORMATION_SCHEMA | CREATE DATABASE `INFORMATION_SCHEMA` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+--------------------+--------------------------------------------------------------------------------+
我们再看下表的字符集定义,是否一样,也是一样的:
use information_schema;
CREATE TABLE `TABLES` (`TABLE_CATALOG` varchar(512) DEFAULT NULL,`TABLE_SCHEMA` varchar(64) DEFAULT NULL,`TABLE_NAME` varchar(64) DEFAULT NULL,`COLUMN_NAME` varchar(64) DEFAULT NULL,`ORDINAL_POSITION` bigint(64) DEFAULT NULL,`COLUMN_DEFAULT` text DEFAULT NULL,`IS_NULLABLE` varchar(3) DEFAULT NULL,`DATA_TYPE` varchar(64) DEFAULT NULL,`CHARACTER_MAXIMUM_LENGTH` bigint(21) DEFAULT NULL,`CHARACTER_OCTET_LENGTH` bigint(21) DEFAULT NULL,`NUMERIC_PRECISION` bigint(21) DEFAULT NULL,`NUMERIC_SCALE` bigint(21) DEFAULT NULL,`DATETIME_PRECISION` bigint(21) DEFAULT NULL,`CHARACTER_SET_NAME` varchar(32) DEFAULT NULL,`COLLATION_NAME` varchar(32) DEFAULT NULL,`COLUMN_TYPE` text DEFAULT NULL,`COLUMN_KEY` varchar(3) DEFAULT NULL,`EXTRA` varchar(30) DEFAULT NULL,`PRIVILEGES` varchar(80) DEFAULT NULL,`COLUMN_COMMENT` varchar(1024) DEFAULT NULL,`GENERATION_EXPRESSION` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;use csdn;
CREATE TABLE `TABLES` (`TABLE_CATALOG` varchar(512) DEFAULT NULL,`TABLE_SCHEMA` varchar(64) DEFAULT NULL,`TABLE_NAME` varchar(64) DEFAULT NULL,`COLUMN_NAME` varchar(64) DEFAULT NULL,`ORDINAL_POSITION` bigint(64) DEFAULT NULL,`COLUMN_DEFAULT` text DEFAULT NULL,`IS_NULLABLE` varchar(3) DEFAULT NULL,`DATA_TYPE` varchar(64) DEFAULT NULL,`CHARACTER_MAXIMUM_LENGTH` bigint(21) DEFAULT NULL,`CHARACTER_OCTET_LENGTH` bigint(21) DEFAULT NULL,`NUMERIC_PRECISION` bigint(21) DEFAULT NULL,`NUMERIC_SCALE` bigint(21) DEFAULT NULL,`DATETIME_PRECISION` bigint(21) DEFAULT NULL,`CHARACTER_SET_NAME` varchar(32) DEFAULT NULL,`COLLATION_NAME` varchar(32) DEFAULT NULL,`COLUMN_TYPE` text DEFAULT NULL,`COLUMN_KEY` varchar(3) DEFAULT NULL,`EXTRA` varchar(30) DEFAULT NULL,`PRIVILEGES` varchar(80) DEFAULT NULL,`COLUMN_COMMENT` varchar(1024) DEFAULT NULL,`GENERATION_EXPRESSION` text NOT NULL,KEY `idx_pri` (`TABLE_SCHEMA`,`TABLE_NAME`,`COLUMN_KEY`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
当然了解决办法很简单,就是在csdn库上的TABLES表里面修改字符长度:
alter table csdn.TABLES modify `EXTRA` varchar(128) DEFAULT NULL;
但是为什么information_schema库的TABLES表里面,为什么`EXTRA` varchar(30) DEFAULT NULL里面能存取48个字符呢,这问题值得后续研究下。
ERROR 1406 (22001): Data Too Long, field len 30, data len 48相关推荐
- 一秒快速修正 mysql ERROR 1406 (22001): Data too long for column ‘name‘ at row 1
222今天导入一个xxx.sql文件时报错ERROR 1406 (22001): Data too long for column.原因是mysql会截断过长的输入,这里需要把sql-mode设置宽松 ...
- mysql error1406_MySQL插入中文时出现ERROR 1406 (22001): Data too long for column 'name' at row 1 (转)...
使用命令行方式登陆到MySQL服务器, 建立一个数据库,数据库编码设为UTF-8.此时,如果直接在命令行窗口使用insert语句插入中文,就遇到类似 ERROR 1406 (22001): Data ...
- Mysql 中ERROR 1406 (22001): Data too long for column 解决方法
导入数据的时候,MYSQL 报错:Data too long for column 解决办法: 在my.ini里找到(此文件在mysql安装目录下) sql-mode="STRICT_TRA ...
- Error: Error while compiling statement: FAILED: SemanticException Unable to load data to destination
ods层新加了一张表,和以前的格式一样 DROP TABLE IF EXISTS ods_students_industry_level; CREATE TABLE `ods_students_ind ...
- ERROR: Can't get master address from ZooKeeper; znode data == null
出现此问题可能是zookeeper不稳定造成的,采用的是虚拟机,经常挂起的状态,使用hbase的list命令出现下面错误,这个可能是hbase的稳定性造成的,解决办法有两种.这里使用第一种办法就解决了 ...
- HBase错误:ERROR: Can't get master address from ZooKeeper; znode data == null 解决办法
一.问题背景 使用命令 $ hbase shell 进入hbase的shell之后使用create命令创建表时出现错误:ERROR: Can't get master address from Zoo ...
- python——csv读取文件报错:error:new-line character seen in unquoted field
记录一下近期遇到的读取csv文件数据问题.使用gzip.open()函数打开压缩文件,csv.reader()函数读取内容. 1.运行代码为: filePath = 'test.csv.gz'with ...
- 用Java向SQL Server数据库中插入float数据报错An error occurred while converting the Float value to JDBC data type
作者:翁松秀 用Java向SQL Server数据库中插入float数据报错 用Java向SQL Server数据库中插入float数据报错 报错信息: 报错原因: 解决方案: 报错信息: An er ...
- Python struct.pack(“!dHHHH%ds“%len(self.data),tt,0,self.tap_lenght,self.tap_type,0,_data)里的%ds是什么意思
今天在看一段Python代码时,看到如下代码 if timestamp:tt = time.time()else:tt = 0.0 if not isinstance(self.data,str):_ ...
最新文章
- Centos6安装Zabbix3.4
- 计算机软件与理论调剂,2021汕头大学计算机软件与理论081202考研调剂信息
- 新手!SDK Manager里找不到API安装的选项怎么办?
- TP查询搜索函数的find select get value
- MySQL通信类型:同步或者异步
- 【教程】VsCode搭建Java开发环境
- Dataset XML 序列化,什么是序列化
- jQuery.fn.extend 与 jQuery.extend 用法
- html5/haXe开发偶感
- python爱心代码_母亲节快到了,用Python给老妈写个祝福小程序吧~
- C#属性默认值设置(model实体类)
- bash shell学习的记录(一)
- css数字怎么换行,css实现连续的英文或数字自动换行的方法
- JS中的对象以及在web前端的应用
- NYOJ 234 吃土豆(基础dp)
- Swift 代码添加约束
- 放弃蚂蚁offer,选择农行软开!
- linux 流量监控利器:iftop
- 算法——AcWing算法提高课中代码和题解
- html异步加载页面,Jquery异步加载页面(load)