知玩指南
白蓝主题五 · 清爽阅读
首页  > 驱动工具

MySQL编码修改实战:轻松解决乱码问题

开发过程中,最让人头疼的不是报错,而是数据明明写进去了,打开一看却变成一堆问号或乱码。这种情况十有八九是 MySQL 编码没整明白。别慌,改编码其实没那么复杂,关键是要知道从哪儿下手。

先搞清楚当前的编码情况

在动手改之前,得先看看现在的编码设置。登录 MySQL 后执行这条命令:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

你会看到一堆变量,重点关注 character_set_databasecharacter_set_server 和表字段本身的字符集。如果里面还夹着 latin1,那基本就是乱码根源了。

临时修改?直接改系统变量

想快速测试效果,可以直接在会话里改:

SET NAMES utf8mb4;

这相当于一次性设置客户端、连接和结果的字符集。但注意,这只是当前连接有效,重启就没了。

永久生效,得动配置文件

真正的解决办法是改 MySQL 的配置文件。Linux 下一般是 /etc/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf,Windows 则是 my.ini

[mysqld] 段落下加上这些:

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

别忘了客户端也得统一,所以在 [client] 段落加一句:

[client]
default-character-set = utf8mb4

数据库和表也得跟上节奏

配置改完只是第一步,已有的数据库和表可能还是老编码。比如你的项目库叫 game_db,可以这样升级:

ALTER DATABASE game_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

接着改具体表:

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

这一步能确保表结构和已有数据都转成新编码。

别漏了字段级别的细节

有时候即使表改了,个别字段还是 varcharlatin1。可以用下面语句检查:

SHOW CREATE TABLE users;

如果发现某些字段没跟着变,单独处理:

ALTER TABLE users MODIFY username VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

应用连接也得匹配

后端代码里连数据库的 URL 别忘了加参数。比如 Java 的 JDBC 连接串:

jdbc:mysql://localhost:3306/game_db?useUnicode=true&characterEncoding=utf8mb4

PHP 的 PDO 也要指定:

$pdo = new PDO('mysql:host=localhost;dbname=game_db;charset=utf8mb4', $user, $pass);

不然程序读出来照样是乱码。

小贴士:utf8mb4 才是真 UTF-8

MySQL 里的 utf8 其实是阉割版,只支持最多 3 字节,像微信昵称里的表情符号(emoji)这种 4 字节的直接存不进去。要用 utf8mb4 才行。别图省事写成 utf8,后面踩坑的是你自己。

改完之后重启 MySQL,重新连上去跑个测试,中文、表情、特殊符号全都能正常显示,才算真正搞定。