MySQL导入SQL文件报错八成源于字符集或变量限制,需先检查character_set_client和collation_connection是否匹配;若出现中文乱码、Unknown collation: 'utf8mb4_0900_ai_ci'或语法错误,多因客户端字符集不一致,建议导入前执行SET NAMES utf8mb4(或utf8),或命令行中用--default-character-set显式指定。

MySQL导入SQL文件报错,八成和字符集或变量限制有关,先查这两个地方准没错。
检查 character_set_client 和 collation_connection 是否匹配
导入时中文乱码、报 Unknown collation: 'utf8mb4_0900_ai_ci' 或直接语法错误,大概率是客户端连接层的字符集没对上。MySQL 8.0 导出的文件默认用 utf8mb4_0900_ai_ci,但 5.7 或更低版本压根不认识这个排序规则。
- 导入前在 MySQL 命令行里执行:
SET NAMES utf8mb4;(如果目标库支持)或退而求其次用SET NAMES utf8; - 更稳妥的做法是在命令行导入时显式指定:
mysql -u 用户名 -p --default-character-set=utf8mb4 数据库名 - 如果报
Unknown collation,打开 SQL 文件全局替换:utf8mb4_0900_ai_ci→utf8mb4_unicode_ci,utf8mb4→utf8(仅限 MySQL 5.7 及以下)
确认 max_allowed_packet 和 wait_timeout 是否足够大
导入中途断开、卡住、报 Packets larger than max_allowed_packet are not allowed,说明服务端限制太小,尤其对百MB级 SQL 文件。
- 临时调高(重启前有效):
SET GLOBAL max_allowed_packet = 536870912;(即 512MB) - 永久生效需改配置文件:
/etc/my.cnf的[mysqld]段下加:max_allowed_packet = 512M,wait_timeout = 28800 - 注意:修改后必须重启 MySQL(
systemctl restart mysqld),且客户端连接也会受wait_timeout影响,不能只调服务端
验证 local_infile 是否启用(尤其 CentOS 环境)
用 source 或 LOAD DATA INFILE 导入本地文件失败,常见于 CentOS 上默认禁用该功能,报错不明显,只显示空响应或权限拒绝。
- 先查状态:
SHOW GLOBAL VARIABLES LIKE 'local_infile';,返回OFF就得开 - 临时开启:
SET GLOBAL local_infile = ON; - 但仅这样还不够——必须在
/etc/my.cnf中同时添加两处:[mysqld]段加local_infile=1,[mysql]段也加local_infile=1(没有就手动新建) - 否则命令行客户端仍无法读取本地路径,
source会静默失败
真正容易被忽略的是:local_infile 需要服务端和客户端双侧都启用,缺一不可;而字符集问题往往在文件开头几行就埋了雷,但报错却出现在几百行之后——建议导入前先用 head -n 50 文件.sql 扫一眼建表语句里的 CHARSET 和 COLLATE 定义。











