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
相关产品推荐
相关产品推荐

