MySQL 默认编码通常是 latin1,不支持中文等 UTF-8 字符,容易导致乱码。要彻底解决,需从客户端、服务端、数据库、表、连接五个层面统一设为 utf8mb4(推荐,兼容 emoji 和完整 UTF-8)。
修改 MySQL 配置文件(my.cnf 或 my.ini)
这是最根本的设置方式,重启后全局生效。找到配置文件(Linux 通常在
/etc/my.cnf或
/etc/mysql/my.cnf;Windows 为
my.ini),在对应段落下添加或修改: [client] 下加:
default-character-set = utf8mb4[mysql] 下加:
default-character-set = utf8mb4[mysqld] 下加:
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake = ON(可选,强制忽略客户端声明)
保存后重启 MySQL 服务:
sudo systemctl restart mysql(Linux)或服务管理器重启(Windows)。
验证当前编码设置是否生效
登录 MySQL 后执行以下命令检查关键项是否均为
utf8mb4:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
重点关注:
character_set_server、
character_set_database、
character_set_client、
character_set_connection、
character_set_results—— 均应显示
utf8mb4。
对已有数据库和表批量修改编码
配置文件修改只影响新建库/表,旧对象需手动转换:
修改数据库编码:ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;修改单张表编码:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;若只想改字符集不重定义字段,用:
ALTER TABLE table_name CHARACTER SET utf8mb4, COLLATE utf8mb4_unicode_ci;
注意:执行前建议备份;含 TEXT/BLOB 字段时,
CONVERT TO更稳妥(会重定义字段类型以适配新字符集)。
应用连接时显式指定编码
即使服务端已设好,部分客户端(如 PHP PDO、Java JDBC、Python MySQLdb)仍可能默认用 latin1 连接。务必在连接字符串或初始化时声明:
PHP PDO:$pdo = new PDO($dsn, $user, $pass, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"]);JDBC URL:
?characterEncoding=utf8mb4&serverTimezone=UTCMySQL 命令行客户端启动时加:
mysql --default-character-set=utf8mb4 -u user -p
这一步能避免“服务端对了,但连接层还是乱码”的常见问题。
