如何在Ubuntu服务器配置MySQL支持UTF-8以解决乱码问题
解决步骤
1. 先排除Nginx的问题
Nginx一般不会直接导致数据库存储的内容变成问号,它的字符集配置仅影响页面输出。不过可以快速确认下:检查Nginx站点配置里是否添加了charset utf-8;,确保响应头的Content-Type为UTF-8,但这不是你当前数据库存成问号的核心原因,优先排查MySQL和JDBC的配置。
2. 修正MySQL全局字符集
从你提供的字符集变量结果来看,character_set_database和character_set_server均为latin1,这两个是数据库的全局默认字符集,即便表指定了utf8mb4,数据库层面的隐性默认设置仍可能导致乱码。
- 编辑Ubuntu上的MySQL配置文件(通常路径为
/etc/mysql/mysql.conf.d/mysqld.cnf),添加或修改以下配置:
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci [client] default-character-set = utf8mb4
- 重启MySQL服务:
sudo systemctl restart mysql - 再次执行
SHOW VARIABLES LIKE 'char%';,确认character_set_database和character_set_server已变为utf8mb4。
3. 强制JDBC连接指定字符集
你建表时指定了utf8mb4,但JDBC连接数据库时若未明确指定字符集,会默认使用服务器原有的latin1进行数据传输,直接导致内容存成问号。
- 修改JDBC连接URL,添加
useUnicode=true&characterEncoding=utf8mb4参数,示例如下:
jdbc:mysql://localhost:3306/你的数据库名?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=UTC
注意:MySQL中的utf8实际是阉割版的utf8mb3,无法存储emoji和部分生僻字,必须使用utf8mb4才是完整的UTF-8支持。
4. 修复已存在的乱码数据
如果已经有内容变成问号,仅修改配置无法恢复原有数据,需要重新导入:
- 导出数据时指定
utf8mb4字符集:mysqldump -u 用户名 -p --default-character-set=utf8mb4 数据库名 > backup.sql - 删除原表,重新执行建表语句后导入数据:
mysql -u 用户名 -p --default-character-set=utf8mb4 数据库名 < backup.sql
5. 确认表的字符集生效
执行SHOW CREATE TABLE users;,检查表的CHARSET=utf8mb4是否真正生效,避免建表语句执行失败却未被察觉。
内容的提问来源于stack exchange,提问作者HimselfProducer
相关产品推荐
相关产品推荐

