使用Node.js从MySQL读取非拉丁字符出现乱码如何解决?
乱码问题根因
你遇到的是典型的UTF-8字符被错误按Latin1二次编码的问题,根源出在MySQL连接的字符集配置不匹配,以及MySQL自带的utf8字符集为阉割版本,无法支持完整的UTF-8编码。
修复步骤
1. 修正数据库连接配置
将mysql连接参数中的charset改为utf8mb4,这是MySQL支持完整4字节UTF-8的标准字符集,可覆盖所有语言字符、特殊符号、emoji等:
const mysql = require("mysql"); const connection = mysql.createConnection({ host: "", user: "", password: "", database: "", charset: "utf8mb4", // 替换之前的utf8/latin1等配置 });
2. 确认存储层字符集配置
确保你查询的库、表、对应存储译文的字段的字符集都统一为utf8mb4,可通过以下SQL查询校验:
-- 查询数据库字符集 SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '你的数据库名'; -- 查询表字符集 SELECT CCSA.character_set_name FROM information_schema.`TABLES` T,information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA WHERE CCSA.collation_name = T.table_collation AND T.table_schema = '你的数据库名' AND T.table_name = '你的表名'; -- 查询字段字符集 SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_schema = '你的数据库名' AND table_name = '你的表名' AND column_name = '存储译文的字段名';
如果字符集不符合要求,可通过以下SQL修改:
-- 修改库字符集 ALTER DATABASE 你的数据库名 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- 修改表及所有字段字符集 ALTER TABLE 你的表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 可选:显式初始化连接字符集
如果修改连接参数后仍存在乱码,可在连接建立后主动执行字符集设置语句,确保整个传输链路字符集统一:
connection.connect((err) => { if (err) throw err; connection.query('SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci', (err) => { if (err) throw err; // 后续执行你的查询逻辑即可 }); });
4. 文件写入逻辑无需调整
你现有的fs.writeFile已经指定了utf8编码,JSON.stringify默认输出UTF-8编码的字符串,这部分配置是正确的,不需要修改。
内容的提问来源于stack exchange,提问作者Seif
相关产品推荐
相关产品推荐

