MySQL8.0使用mysqlimport导入SQL文件报1406、1261错误如何解决
核心根因
所有报错的核心触发原因是用错了导入工具:
mysqlimport是LOAD DATA INFILE语法的命令行封装,仅支持导入制表符/逗号分隔的纯文本裸数据(如CSV、TXT格式的逐行数据文件),本身不具备SQL语法解析能力。- 用它加载
mysqldump导出的、包含CREATE TABLE/INSERT语句的SQL脚本时,程序会把整个SQL文件的纯文本内容按默认分隔符切分,硬塞到表字段中,从第一行数据开始就完全错位,和SQL文件里写的插入值没有任何关联。
修复步骤
- 先恢复目标库
ecm2中table_name的原始表结构,把之前修改为TEXT类型的country字段改回VARCHAR(20),保证表结构和导出时的定义完全一致。 - 弃用
mysqlimport命令,换用mysql命令行客户端执行SQL脚本导入,在CMD中执行以下命令,执行后输入root账号密码即可开始导入:mysql -uroot -p ecm2 < "C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\table_name.sql"注意:标准
mysqldump导出的文件默认包含DROP TABLE IF EXISTS、CREATE TABLE语句,导入时会自动删除目标库的同名旧表后重建并导入全量数据。如果你需要保留现有目标表、仅追加数据,提前用文本编辑器打开SQL文件,删除其中的删表、建表语句,仅保留INSERT相关部分再执行导入即可。 - 导入完成后可登录MySQL执行抽查语句,确认数据导入正确:
USE ecm2; SELECT country, country_long, name, gid_no FROM table_name LIMIT 5;
对应报错的触发逻辑
- 报错
Error: 1406, Data too long for column 'country' at row 1:mysqlimport把SQL文件开头的建表语句文本当成第一行第一列的数据插入,塞入的内容是大段SQL定义文本,长度远超过VARCHAR(20)的限制,和INSERT语句里写的3-4位国家编码没有任何关系。 - 把
country字段改为TEXT后触发Error: 1261, Row 1 doesn't contain data for all columns:mysqlimport按默认的换行、制表符切分SQL文本时,切出来的字段数量和表定义的22个字段数量不匹配,因此触发列数缺失报错。
内容的提问来源于stack exchange,提问作者Sachin D
相关产品推荐
相关产品推荐

