开发过程中,最让人头疼的不是报错,而是数据明明写进去了,打开一看却变成一堆问号或乱码。这种情况十有八九是 MySQL 编码没整明白。别慌,改编码其实没那么复杂,关键是要知道从哪儿下手。
先搞清楚当前的编码情况
在动手改之前,得先看看现在的编码设置。登录 MySQL 后执行这条命令:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
你会看到一堆变量,重点关注 character_set_database、character_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;
这一步能确保表结构和已有数据都转成新编码。
别漏了字段级别的细节
有时候即使表改了,个别字段还是 varchar 带 latin1。可以用下面语句检查:
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,重新连上去跑个测试,中文、表情、特殊符号全都能正常显示,才算真正搞定。