news 2026/5/11 23:34:01

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/4/27 20:00:40

终极教育邮箱生成指南:5分钟快速获取免费Edu邮箱

终极教育邮箱生成指南&#xff1a;5分钟快速获取免费Edu邮箱 【免费下载链接】Edu-Mail-Generator Generate Free Edu Mail(s) within minutes 项目地址: https://gitcode.com/gh_mirrors/ed/Edu-Mail-Generator 在数字化学习时代&#xff0c;教育邮箱已成为获取学生专属…

作者头像 李华
网站建设 2026/4/25 23:18:31

AI图像修复实战案例:3倍放大去马赛克,细节还原惊人

AI图像修复实战案例&#xff1a;3倍放大去马赛克&#xff0c;细节还原惊人 1. 技术背景与应用价值 在数字内容爆炸式增长的今天&#xff0c;大量历史图像、监控截图、网络图片因分辨率低、压缩严重而难以满足现代高清显示需求。传统图像放大技术如双线性插值或Lanczos算法&am…

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

IDM破解终极指南:3步实现永久免费下载加速

IDM破解终极指南&#xff1a;3步实现永久免费下载加速 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为IDM试用期结束而烦恼吗&#xff1f;想要永久免费享受…

作者头像 李华
网站建设 2026/5/3 9:37:58

Qwen3-4B保姆级教程:暗黑风格WebUI个性化定制指南

Qwen3-4B保姆级教程&#xff1a;暗黑风格WebUI个性化定制指南 1. 引言 1.1 学习目标 本文旨在为开发者和AI爱好者提供一份完整的 Qwen3-4B-Instruct 模型 暗黑风格 WebUI 的本地部署与个性化定制指南。通过本教程&#xff0c;您将掌握&#xff1a; 如何快速部署基于 Qwen/…

作者头像 李华
网站建设 2026/5/11 12:46:42

IINA:macOS终极免费视频播放器完整指南

IINA&#xff1a;macOS终极免费视频播放器完整指南 【免费下载链接】iina 项目地址: https://gitcode.com/gh_mirrors/iin/iina 还在为macOS寻找完美的视频播放解决方案吗&#xff1f;IINA播放器凭借其强大的mpv引擎和原生macOS界面设计&#xff0c;为用户提供了前所未…

作者头像 李华
网站建设 2026/5/11 23:24:26

AI读脸术模型版本管理:多模型共存切换策略

AI读脸术模型版本管理&#xff1a;多模型共存切换策略 1. 引言 1.1 业务背景与挑战 在人脸识别与属性分析领域&#xff0c;模型版本迭代频繁是常态。随着数据积累和算法优化&#xff0c;新的年龄与性别识别模型不断推出&#xff0c;准确率更高、推理更轻量。然而&#xff0c…

作者头像 李华