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

Node.js从MySQL获取非英文字符时出现编码乱码问题求助

解决Node.js MySQL查询结果乱码问题

你遇到的是典型的UTF-8编码被错误解析为latin1导致的乱码问题——从你给出的乱码字符串Візочки就能看出来,这是UTF-8字符被用latin1解码后的结果。结合你提供的数据库变量信息,问题根源主要在两个地方:服务器默认字符集不匹配,以及Node.js连接的字符集配置没有完全生效。

下面是具体的解决步骤:

1. 修复Node.js连接配置 + 规范连接生命周期

你之前尝试添加charset可能没到位,而且原代码里connection.end()的位置有误(会导致连接可能在查询完成前就关闭),修改后的代码如下:

var mysql = require('mysql');
var connection = mysql.createConnection({ 
  host: 'localhost', 
  user: 'user', 
  password: 'password', 
  database: "databasename",
  charset: 'utf8mb4', // 推荐用utf8mb4,支持所有UTF-8字符(包括emoji),不需要的话也可以用'utf8'
  collation: 'utf8_unicode_ci'
});

connection.connect(function(err) {
  if (err) throw err;
  
  // 手动执行SET NAMES命令,强制确认字符集(避免自动协商失败)
  connection.query('SET NAMES utf8mb4 COLLATE utf8_unicode_ci', function(err) {
    if (err) throw err;
    
    // 执行查询
    connection.query('SELECT * FROM main_categories', function (error, results, fields) { 
      if (error) throw error; 
      console.log(results); 
      // 务必在查询完成后再关闭连接
      connection.end();
    });
  });
});

2. 调整MySQL服务器默认字符集(彻底解决问题)

从你的变量信息来看,character_set_server是latin1,collation_server是latin1_swedish_ci,这会导致新连接默认用latin1协商字符集,即使数据库和表是utf8也可能出问题。你需要修改MySQL的配置文件(my.cnf或my.ini,位置根据系统不同有所差异):

在[mysqld]区块添加:

character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

修改后重启MySQL服务,这样服务器默认字符集就和你的数据库、表保持一致,后续连接就不会有字符集协商的问题了。

为什么之前的charset设置无效?

可能是这几个原因:

  • 你设置的charset值不正确(比如拼写错误,或者用了utf8但服务器默认latin1导致协商失败)
  • connection.end()的位置错误,导致查询还没完成连接就关闭,结果输出异常
  • 没有手动执行SET NAMES命令,强制确认字符集的生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:33:14