news 2026/5/1 9:04:23

Docker部署旧版本系统MySQL5.7+乱码问题解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker部署旧版本系统MySQL5.7+乱码问题解决方案

问题描述

公司需要部署一个周报管理系统,该系统目前在Windows环境下运行良好。现在,计划将其迁移到服务器上进行部署,故将这个活交给我部署,但由于系统较为陈旧,依然使用的是JSP技术栈。同时,还需要拉取tomcat:7-jre8的Docker镜像。更棘手的问题是,系统使用的是MySQL 5.7+版本,而不是当前主流的MySQL 8+,这导致在适配新的UTF-8编码格式时遇到了一些挑战。在使用Docker部署该周报管理系统后,虽然容器成功启动,但访问应用页面时却发现中文内容出现了乱码:

æ ´å°±å»ºç« å·¥ç¨‹å’Œå…±å»ºé¡¹ç›®ç®¡ç�†ç³»ç»Ÿ

同时,应用能够正常访问,但部分功能可能受到影响。

问题分析

通过查看应用日志和配置,我们逐步排查了可能导致乱码的原因:

  1. 应用编码配置:应用的JSP页面和web.xml已经配置了UTF-8编码
  2. Tomcat编码配置:默认Tomcat配置可能没有启用UTF-8编码支持
  3. MySQL字符集配置:数据库初始化和连接可能存在编码不一致问题
  4. 数据库连接参数:使用了不兼容的JDBC连接参数

解决方案

1. 检查应用编码配置

首先确认应用本身已经配置了UTF-8编码:

  • JSP页面:所有JSP页面都包含<%@ page contentType="text/html;charset=UTF-8"%>
  • web.xml:配置了CharacterEncodingFilter,强制使用UTF-8编码
<filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

2. 调整Tomcat编码设置

修改Dockerfile的文件,为Tomcat添加UTF-8编码支持:

# 设置环境变量,添加UTF-8编码支持 ENV JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" # 配置Tomcat URI编码为UTF-8 RUN sed -i 's/<Connector port="8080" protocol="HTTP\/1.1"/<Connector port="8080" protocol="HTTP\/1.1" URIEncoding="UTF-8"/' /usr/local/tomcat/conf/server.xml

以下为我完整的Dockerfile的文件配置

# 使用官方Tomcat 7镜像作为基础镜像 FROM tomcat:7-jre8 # 维护者信息 LABEL maintainer="周报管理系统" # 移除Tomcat默认的ROOT应用 RUN rm -rf /usr/local/tomcat/webapps/ROOT # 将打包好的WAR文件复制到Tomcat的webapps/weekly目录 COPY ./tomcat /usr/local/tomcat/webapps/weekly # 暴露Tomcat端口 EXPOSE 8080 # 设置环境变量,添加UTF-8编码支持 ENV JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" # 配置Tomcat URI编码为UTF-8 RUN sed -i 's/<Connector port="8080" protocol="HTTP\/1.1"/<Connector port="8080" protocol="HTTP\/1.1" URIEncoding="UTF-8"/' /usr/local/tomcat/conf/server.xml # 启动Tomcat CMD ["catalina.sh", "run"]

3. 优化MySQL配置

在docker-compose.yml中添加完整的MySQL字符集配置:

command:>--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --init-connect='SET NAMES utf8mb4' --skip-character-set-client-handshake --sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

4. 修复数据库连接参数

检查并修复jeeplus.properties中的数据库连接参数。旧版本MySQL驱动不支持某些参数,导致连接失败:

错误配置

jdbc.url=jdbc:mysql://mysql:3306/weekly?useUnicode=true&characterEncoding=utf-8&useSSL=false&connectionCollation=utf8mb4_unicode_ci&serverTimezone=Asia/Shanghai

正确配置

jdbc.url=jdbc:mysql://mysql:3306/weekly?useUnicode=true&characterEncoding=utf-8&useSSL=false
正确配置的修改:
  1. 去掉了connectionCollation=utf8mb4_unicode_ci:这个参数与字符集的选择有关,但它通常不需要在 JDBC URL 中显式指定,除非有特别的需求,通常 MySQL 默认就会使用 utf8mb4 编码。
  2. 去掉了serverTimezone=Asia/Shanghai:这个参数用于设置时区,可能在某些情况下需要,但它并不是必须的,特别是如果 MySQL 服务器的时区配置正确的话。去掉这个参数有时能避免时区冲突问题,尤其是在使用容器或者跨时区部署时。

总结,正确配置去除了多余的配置项,确保了简单且有效的连接配置。

重新部署验证

  1. 停止并移除旧容器

    docker-composedown
  2. 删除旧数据卷(如果需要重新初始化数据):

    dockervolumermweekly_mysql_data
  3. 重新构建镜像并启动容器

    docker-composeup -d --build
  4. 验证部署结果

    # 查看容器状态docker-composeps# 查看应用日志docker-composelogs -f tomcat
  5. 访问应用验证

    http://172.16.xxx.xxx:8082/weekly/a/login

分享一下docker-compose.yml的配置

# 创建一个新的用户定义网络,手动指定一个未被占用的子网networks:weekly_network:driver:bridgeipam:config:-subnet:10.0.0.0/24# 使用一个未被占用的私有网络子网services:# MySQL数据库服务mysql:image:mysql:5.7.44container_name:weekly_mysqlrestart:alwaysenvironment:MYSQL_ROOT_PASSWORD:root_password# 替换为你的根密码MYSQL_DATABASE:weekly# 数据库名MYSQL_USER:weekly_user# 数据库用户名MYSQL_PASSWORD:weekly_password# 数据库密码ports:-"3308:3306"volumes:-./mysql/weekly.sql:/docker-entrypoint-initdb.d/init.sql# 初始化脚本-mysql_data:/var/lib/mysql# 数据持久化command:>--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --init-connect='SET NAMES utf8mb4' --skip-character-set-client-handshake --sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONnetworks:-weekly_network# Tomcat应用服务tomcat:build:.container_name:weekly_tomcatrestart:alwaysdepends_on:-mysqlports:-"8082:8080"environment:-SPRING_PROFILES_ACTIVE=prodvolumes:-tomcat_logs:/usr/local/tomcat/logs# 日志持久化networks:-weekly_networkvolumes:mysql_data:driver:localtomcat_logs:driver:local

预防措施

  1. 统一编码标准:确保应用、Tomcat、MySQL和数据库连接都使用UTF-8编码
  2. 适配驱动版本:根据MySQL版本选择合适的JDBC驱动,避免使用不兼容的连接参数
  3. 详细日志记录:启用应用和数据库的详细日志,便于排查问题
  4. 定期备份数据:确保数据安全,便于恢复
  5. 测试编码兼容性:在开发环境中测试多语言支持,确保编码正确
  6. 使用utf8mb4字符集:支持完整的Unicode字符,包括emoji表情

总结

通过系统性地排查和解决,我们成功解决了周报管理系统Docker部署中的乱码问题。主要解决步骤包括:

  1. 调整Tomcat配置,确保启用UTF-8编码支持
  2. 优化MySQL配置,统一字符集设置
  3. 修复数据库连接参数,确保与驱动版本兼容
  4. 重新部署验证,确认问题解决

如果觉得有帮助,欢迎点赞收藏!有问题欢迎评论区交流~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:11:09

超实用Chrome下载管理神器:3步搞定高效文件下载

超实用Chrome下载管理神器&#xff1a;3步搞定高效文件下载 【免费下载链接】download-manager 谷歌浏览器下载管理器插件【A chrome extension for managing download】 项目地址: https://gitcode.com/gh_mirrors/dow/download-manager 还在为浏览器下载管理混乱而烦恼…

作者头像 李华
网站建设 2026/5/1 8:36:10

STM32中wl_arm中断处理机制图解说明

深入STM32中断机制&#xff1a;从wl_arm看嵌入式系统的“安全网”设计你有没有遇到过这样的情况&#xff1f;代码明明没改几行&#xff0c;下载进STM32后系统却突然“死机”&#xff0c;串口无输出、LED不闪烁&#xff0c;用调试器一连&#xff0c;程序卡在一个奇怪的无限循环里…

作者头像 李华
网站建设 2026/5/1 7:38:48

PoeCharm实战指南:5个核心功能让流放之路BD构建效率翻倍

PoeCharm实战指南&#xff1a;5个核心功能让流放之路BD构建效率翻倍 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm PoeCharm是专为中文玩家深度优化的Path of Building汉化版本&#xff0c;集成了…

作者头像 李华
网站建设 2026/5/1 7:19:46

Fun-ASR-MLT-Nano-2512语音模型安全:模型水印技术

Fun-ASR-MLT-Nano-2512语音模型安全&#xff1a;模型水印技术 1. 引言 随着大模型在语音识别领域的广泛应用&#xff0c;模型的知识产权保护和安全性问题日益凸显。Fun-ASR-MLT-Nano-2512 是由阿里通义实验室推出的多语言语音识别大模型&#xff0c;支持31种语言的高精度识别…

作者头像 李华
网站建设 2026/4/30 19:29:36

BiliTools:一站式B站视频下载神器,轻松保存你喜欢的番剧和视频

BiliTools&#xff1a;一站式B站视频下载神器&#xff0c;轻松保存你喜欢的番剧和视频 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_…

作者头像 李华
网站建设 2026/5/1 7:11:20

Youtu-2B快速上手指南:HTTP访问按钮使用教程

Youtu-2B快速上手指南&#xff1a;HTTP访问按钮使用教程 1. 学习目标与前置准备 本教程旨在帮助开发者和AI爱好者快速掌握如何通过HTTP访问按钮部署并使用Youtu-2B语言模型服务。完成本指南后&#xff0c;您将能够&#xff1a; 成功启动基于Youtu-LLM-2B的镜像服务 利用平台…

作者头像 李华