插件窝 干货文章 docker mysql 中文乱码

docker mysql 中文乱码

字符集 MySQL character set 297    来源:    2025-04-26

Docker MySQL 中文乱码问题解决方案

问题原因

在 Docker 中运行 MySQL 时出现中文乱码,通常是由于字符集设置不正确导致的。MySQL 默认的字符集可能不是 UTF-8,或者客户端连接时未指定正确的字符集。

解决方案

方法1:启动容器时指定字符集参数

docker run -d --name mysql-container \
  -e MYSQL_ROOT_PASSWORD=yourpassword \
  -p 3306:3306 \
  mysql:tag \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci

方法2:使用自定义配置文件

  1. 创建自定义配置文件 my.cnf
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
  1. 启动容器时挂载配置文件:
docker run -d --name mysql-container \
  -e MYSQL_ROOT_PASSWORD=yourpassword \
  -p 3306:3306 \
  -v /path/to/my.cnf:/etc/mysql/conf.d/my.cnf \
  mysql:tag

方法3:对于已存在的容器

  1. 进入 MySQL 容器:
docker exec -it mysql-container bash
  1. 登录 MySQL:
mysql -u root -p
  1. 执行以下 SQL 命令:
SET NAMES utf8mb4;
ALTER DATABASE your_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

方法4:检查客户端连接设置

确保客户端连接时也指定了正确的字符集,例如在 JDBC 连接字符串中添加:

?useUnicode=true&characterEncoding=UTF-8

或在 Python 连接时指定:

charset='utf8mb4'

验证字符集设置

登录 MySQL 后执行以下命令验证字符集设置:

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

确保以下变量值为 utf8mb4: - character_set_client - character_set_connection - character_set_database - character_set_results - character_set_server

注意事项

  1. 推荐使用 utf8mb4 而不是 utf8,因为 utf8mb4 支持完整的 Unicode 字符集(包括 emoji 等)
  2. 如果数据已经存在乱码,可能需要导出数据、修改字符集后重新导入
  3. 确保应用程序连接数据库时也使用相同的字符集

通过以上方法,应该能够解决 Docker 中 MySQL 的中文乱码问题。