mysql升级后字符集变化怎么办_mysql编码问题解决

来源:这里教程网 时间:2026-02-28 20:33:08 作者:

MySQL升级后字符集变化,最常见的是默认字符集从

latin1
变成
utf8mb4
,导致旧表、旧连接或程序读写乱码。核心不是“改回去”,而是统一编码链路:服务端、数据库、表、列、客户端连接,全部对齐
utf8mb4
并启用
utf8mb4_unicode_ci
(或
utf8mb4_0900_as_cs
)排序规则。

检查当前实际字符集配置

别只看

my.cnf
,升级后配置文件可能没生效,优先查运行时值:

执行
SHOW VARIABLES LIKE 'character_set%';
,重点关注
character_set_server
character_set_database
character_set_client
character_set_connection
执行
SHOW VARIABLES LIKE 'collation%';
,确认
collation_server
collation_database
是否为
utf8mb4_*
系列
对关键表运行
SHOW CREATE TABLE 表名;
,查看表和字段是否仍为
CHARSET=latin1
utf8

安全升级存量表到utf8mb4

不能直接

ALTER DATABASE ... CHARACTER SET = utf8mb4
就完事——它只改默认值,不影响已有表结构。必须逐表转换:

先备份:
mysqldump -u用户 -p --default-character-set=utf8mb4 数据库名 > backup.sql
修改表字符集:
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
若字段是
TEXT
/
VARCHAR
且原长度接近上限(如
VARCHAR(255)
),注意
utf8mb4
单字符最多占4字节,可能触发行大小超限,需酌情减小长度或启用
innodb_large_prefix=ON
(MySQL 5.7.7+默认开启)

确保应用连接使用utf8mb4

即使服务端设对了,客户端不声明,照样走默认

latin1
。不同语言处理方式不同:

PHP PDO:DSN中加
;charset=utf8mb4
,例如
mysql:host=localhost;dbname=test;charset=utf8mb4
;或连接后执行
$pdo->exec("SET NAMES utf8mb4");
Java JDBC:URL加参数
?characterEncoding=utf8mb4&serverTimezone=UTC
Python PyMySQL/MySQLdb:创建连接时指定
charset='utf8mb4'
命令行客户端:启动时加
--default-character-set=utf8mb4
,或在
my.cnf
[client]
段写
default-character-set=utf8mb4

配置文件(my.cnf)正确写法示例

避免只在

[mysqld]
段设置,要覆盖服务端、客户端、连接三端:

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake = OFF
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4

改完重启MySQL,并用前面的

SHOW VARIABLES
验证是否全部生效。

相关推荐