NodeJS 14.5.0连接MySQL 5.5.35读取数据字符乱码问题求解
解决Node.js mysql模块读取MySQL数据的字符乱码问题
我来帮你排查这个字符乱码问题,这类问题通常是数据库存储编码和Node.js连接编码不匹配导致的,咱们一步步来解决:
第一步:先确认数据库端的真实编码情况
你提到原文没提供数据库字符集的具体设置,这是排查的关键。先运行以下SQL命令,获取核心信息:
-- 查看数据库全局字符集相关配置 SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%'; -- 查看目标表的字符集和创建语句 SHOW CREATE TABLE your_target_table_name; -- 查看目标字段的字符集细节 SHOW FULL COLUMNS FROM your_target_table_name LIKE 'your_target_column_name';
这些结果能帮我们确定数据实际的存储编码,以及数据库连接层的默认编码规则。
第二步:调整Node.js连接配置
根据数据库的实际情况,针对性调整连接参数:
情况1:数据库表/字段使用utf8mb4(或utf8)编码
如果你的数据库表和字段本身是utf8mb4(推荐,支持所有Unicode字符)或utf8(你的目标字符ł、ń属于BMP范围,utf8也能覆盖),修改连接配置如下:
const mysql = require('mysql'); const dbConfig = require('../../config/database.json'); dbConfig.connectionLimit = 10; const connection = mysql.createPool({ ...dbConfig, charset: 'utf8mb4', // 优先用utf8mb4,兼容更多字符 // 初始化连接时执行SET NAMES,确保连接编码完全匹配 initConnection: (conn, callback) => { conn.query('SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci', (err) => { if (err) return callback(err); callback(null, conn); }); } }); module.exports = connection;
情况2:数据库表/字段是latin1编码,但存储了UTF-8数据(双重编码)
如果你的表字段是latin1,但数据实际是被错误地以UTF-8编码存入的(这种情况很常见),可以先临时用以下方式读取正确内容:
const mysql = require('mysql'); const dbConfig = require('../../config/database.json'); dbConfig.connectionLimit = 10; dbConfig.charset = 'latin1'; // 先以latin1读取原始字节 const connection = mysql.createPool(dbConfig); // 读取后转码为UTF-8 connection.query('SELECT your_target_column FROM your_target_table', (err, results) => { if (err) throw err; const correctedValue = Buffer.from(results[0].your_target_column, 'latin1').toString('utf8'); console.log(correctedValue); // 应该显示Cieśliński });
注意:这只是临时方案,长期建议修复数据库编码:先备份数据,再将表转成utf8mb4:
ALTER TABLE your_target_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
第三步:验证结果
调整配置后重新读取数据,看是否能正确显示Cieśliński。如果还是有问题,把第一步获取的数据库字符集信息补充上来,我可以帮你进一步排查。
内容的提问来源于stack exchange,提问作者NakedCat
相关产品推荐
相关产品推荐

