You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:04:59