LOAD DATA INFILE 报“Incorrect string value”错,根本原因是客户端、连接层、表字符集不一致;需显式指定 CHARACTER SET utf8mb4,确保导出用 OPTIONALLY ENCLOSED BY '"',并启用 local_infile。

LOAD DATA INFILE 报错 “Incorrect string value” 怎么指定编码
根本原因是客户端、连接层、表字符集不一致,LOAD DATA INFILE 默认用连接的 character_set_client 解析文本,不是文件实际编码。哪怕文件是 UTF-8,如果连接设成 latin1,MySQL 就会把多字节 UTF-8 字节当单字节乱解。
必须显式声明文件编码,用 CHARACTER SET utf8mb4(别用 utf8,那是 MySQL 的残缺别名):
LOAD DATA INFILE '/path/to/data.csv' INTO TABLE my_table CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
- 执行前先确认连接字符集:
SHOW VARIABLES LIKE 'character_set%';,重点看character_set_client和character_set_connection - 如果用
mysql命令行导入,启动时加参数:mysql --default-character-set=utf8mb4 -u user -p - 表字段本身也得是
utf8mb4:检查SHOW CREATE TABLE my_table;,否则即使导入成功,存进去也会截断或转成 ?
导出 CSV 时字段含逗号或换行,LOAD DATA 导入失败
MySQL 默认不处理字段内嵌的分隔符,FIELDS TERMINATED BY ',' 遇到内容里的逗号就直接切开,导致列数错位、类型转换失败。
导出时就得让字段“可识别地包裹”,导入时再对应解析:
- 导出用
SELECT ... INTO OUTFILE时加OPTIONALLY ENCLOSED BY '"':SELECT * FROM my_table INTO OUTFILE '/tmp/export.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';
- 导入时必须配对写
OPTIONALLY ENCLOSED BY '"',否则引号会被当成字段内容 - 注意:Windows 换行是
\r\n,Linux 是\n;导出环境和导入环境不一致时,LINES TERMINATED BY必须匹配,否则最后一列可能带多余回车
mysqldump 导出的 SQL 文件用 source 导入报错 “Unknown character set: ‘utf8mb4’”
这是低版本 MySQL(如 5.5 或部分 5.6)不识别 utf8mb4,但高版本 mysqldump 默认写这个字符集声明。
不能改表结构去迁就旧版本,而是控制 dump 行为:
- 导出时强制用兼容字符集:
mysqldump --default-character-set=utf8(注意是utf8,不是utf8mb4) - 或者跳过字符集声明:
mysqldump --skip-set-charset,然后手动在 SQL 文件开头加SET NAMES utf8; - 更稳妥的做法是导出时不带建表语句,只导数据:
mysqldump --no-create-info --skip-set-charset,再用目标库已有表结构导入
LOAD DATA 读取本地文件被拒绝:ERROR 1290 (HY000)
这是 MySQL 启动时禁用了 local_infile,属于安全限制,默认关闭。
要启用,得两端同时放开:
- 服务端:启动 mysqld 时加
--local-infile=1,或在my.cnf的[mysqld]段加local_infile=1,然后重启 - 客户端:连接时加
--local-infile=1,例如:mysql --local-infile=1 -u root -p - 运行中也可临时开:
SET GLOBAL local_infile = 1;,但需要FILE权限,且重启后失效 - 注意:
LOAD DATA LOCAL INFILE和LOAD DATA INFILE不同——前者读客户端文件,后者读服务端文件;报这个错基本都是用了LOCAL但没开客户端开关
字符集、分隔符、权限这三块只要有一处没对齐,LOAD DATA 就会静默错位或报奇怪的语法错误。最容易漏的是:导出时没 ENCLOSED BY,导入时却指望它能自动识别字段边界;还有就是以为文件存成 UTF-8 就万事大吉,忘了连接层和表定义也得同步改。










