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

Docker后端镜像UTF-8编码异常:Node.js+MySQL环境泰文乱码

解决MySQL + Node.js Express容器中泰文查询乱码问题

以下是针对你遇到的泰文数据查询乱码问题的排查方向和解决步骤:

1. 验证MySQL服务器的全局编码配置

进入MySQL容器,执行以下命令检查编码参数:

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

需确保以下参数值为utf8mb4或utf8mb4_unicode_ci:

  • character_set_server
  • character_set_database
  • collation_server
  • collation_database

如果参数不符合,修改MySQL配置文件(如/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld]段添加:

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

修改后重启MySQL容器生效。

2. 确认数据库、表、字段的编码设置

即使服务器全局编码正确,数据库、表或字段的编码可能未同步:

  • 检查数据库编码:
    SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME 
    FROM INFORMATION_SCHEMA.SCHEMATA 
    WHERE SCHEMA_NAME = '你的数据库名';
    
  • 检查anime表的编码:
    SHOW CREATE TABLE anime;
    
    需确保表的DEFAULT CHARSET为utf8mb4,COLLATE为utf8mb4_unicode_ci。
  • 检查title字段的编码:
    SHOW FULL COLUMNS FROM anime WHERE Field = 'title';
    
    需确保字段的Collation为utf8mb4_unicode_ci。

若编码不符,执行以下SQL修改:

-- 修改数据库编码
ALTER DATABASE 你的数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改表编码并转换现有数据
ALTER TABLE anime CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 单独修改字段编码(可选,若表修改未生效)
ALTER TABLE anime MODIFY COLUMN title VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 修正mysql2连接配置的错误项

你的连接配置中存在非标准参数,且需确保连接初始化时正确设置编码:

  • 移除无效的encoding参数(mysql2不支持该配置项),优化后的连接池配置:
    const mysql = require('mysql2');
    
    const pool = mysql.createPool({
      host: '你的MySQL容器地址',
      user: '数据库用户名',
      password: '数据库密码',
      database: '你的数据库名',
      charset: 'utf8mb4',
      collation: 'utf8mb4_unicode_ci',
      connectionLimit: 10,
      // 自动在连接初始化时执行编码设置
      initSql: 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;'
    });
    
    console.log('mysql2 pool ready');
    module.exports = pool.promise();
    

4. 设置Node.js容器的系统编码

容器的系统环境编码可能影响字符解析,在Dockerfile中添加UTF-8环境变量:

FROM node:20.10.0
ENV NODE_ENV=production
# 强制设置系统UTF-8编码
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8

WORKDIR /app

COPY ["package.json", "package-lock.json*", "./"]

RUN npm install --production

COPY . .

CMD ["npm", "start"]

重新构建镜像并重启后端容器。

5. 确保Express响应头的UTF-8编码

在接口返回数据时,明确设置响应的Content-Type编码:

  • 单个接口设置:
    app.get('/api/anime', async (req, res) => {
      const get_image_and_title = `SELECT DISTINCT title, anime_image FROM anime`;
      const [image_and_title] = await pool.execute(get_image_and_title);
      
      // 设置响应编码
      res.setHeader('Content-Type', 'application/json; charset=utf-8');
      res.json(image_and_title);
    });
    
  • 全局设置(推荐):
    const express = require('express');
    const app = express();
    
    // 全局设置请求和响应的UTF-8编码
    app.use(express.json({ charset: 'utf-8' }));
    app.use(express.urlencoded({ extended: true, charset: 'utf-8' }));
    

内容的提问来源于stack exchange,提问作者SaRai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:16:03