phpmyadmin 导出不自动添加 set names,因其设计认为字符集应由导入端协商;需手动在 sql 文件首行插入 set names utf8mb4 或 gbk,或改用 mysqldump 并指定 --default-character-set。
phpmyadmin 本身不提供“导出时自动添加 set names”的开关选项——它默认不写这行,无论你选 utf8 还是 gbk。这不是遗漏,而是设计逻辑:phpmyadmin 认为字符集应由导入端统一协商,而非硬编码进 sql 文件。
为什么 phpMyAdmin 导出文件里没有 SET NAMES
从源码和实际行为看,phpMyAdmin 的导出流程(export.php)只生成表结构、数据和部分元信息,SET NAMES 不在生成逻辑中。它依赖导入环节的 charset_of_file 参数触发会话设置(见 import.php 中的 PMA_DBI_query('SET NAMES ...')),但这个动作发生在导入时,且仅当用户手动选择了非 UTF-8 编码才执行。
这意味着:
- 你导出一个 UTF-8 文件,phpMyAdmin 不加
SET NAMES utf8mb4; - 你导出一个 GBK 文件,它也不加
SET NAMES gbk; - 导入时若没选对“文件的字符集”,那连导入环节的
SET NAMES都不会触发。
导出后手动补 SET NAMES 是最稳方案
既然 phpMyAdmin 不自动加,就自己加——简单、可控、兼容所有场景。关键不是“加在哪”,而是“加得准”:
- 打开导出的
.sql文件,用 VS Code 或 Notepad++(确保无 BOM)编辑; - 在第一行插入(注意空格和分号):
SET NAMES utf8mb4;(UTF-8 场景)或SET NAMES gbk;(GBK 场景); - 如果文件开头已有
USE `db_name`;,把SET NAMES放它前面; - 不要加
SET CHARACTER SET或SET character_set_client等冗余语句,SET NAMES已隐式设置三者; - 确认数据库服务端支持该字符集(如
SHOW VARIABLES LIKE 'character_set%'中character_set_server允许gbk)。
用 mysqldump 替代 phpMyAdmin 导出(适合脚本化场景)
如果你需要可重复、带 SET NAMES 的导出流程,直接绕过 phpMyAdmin 更可靠:
- 命令行执行:
mysqldump --default-character-set=utf8mb4 -u root -p db_name > dump.sql; -
--default-character-set=utf8mb4必须放在mysqldump命令最前面,否则无效; - 生成的文件头部会自动包含:
SET NAMES utf8mb4;和SET FOREIGN_KEY_CHECKS=0;等; - 若需 GBK,改用:
mysqldump --default-character-set=gbk -u root -p db_name > dump.sql,但需确保 MySQL 服务端已加载gbk字符集(SHOW CHARSET LIKE 'gbk';可查)。
真正容易被忽略的是:即使你加了 SET NAMES utf8mb4,如果目标 MySQL 实例的 character_set_server 是 latin1,且连接未显式指定 charset,那这行语句仍可能被降级忽略。所以导出前先确认服务端配置,比导出时加哪行更关键。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











