Nodejs 使用 sqlite 时 遇到 中文乱码
Nodejs 使用 sqlite 时 遇到 中文乱码
最近在处理一批数据的时候,发现插入中文之后会乱码。但以前系统插入中文非常正常,不会出现乱码。 调查之后,从前台到后台都没问题,最后插入数据库的时候出错。发现是 % 在作怪。
比如要向数据库插入 中文测试 % 插入数据库之后,就会变成 -�K� %
而通过 SqliteDev 直接操作数据库却没有任何问题,无论是中文还是 % 都正常插入了数据库。 自己调查之后,也没有发现原因所在,Google 之后也找不到类似的案例,不知道这是什么原因造成的?
现在自己所能想到的是在插入数据库的时候,替换 % ,再插入数据库。不知道是否还有更好的解决方案呢?
用的数据库驱动是:http://github.com/mapbox/node-sqlite3
先谢过了。
最近在处理一批数据的时候,发现插入中文之后会乱码。但以前系统插入中文非常正常,不会出现乱码。 调查之后,从前台到后台都没问题,最后插入数据库的时候出错。发现是 % 在作怪。
比如要向数据库插入 中文测试 % 插入数据库之后,就会变成 -�K� %
而通过 SqliteDev 直接操作数据库却没有任何问题,无论是中文还是 % 都正常插入了数据库。 自己调查之后,也没有发现原因所在,Google 之后也找不到类似的案例,不知道这是什么原因造成的?
现在自己所能想到的是在插入数据库的时候,替换 % ,再插入数据库。不知道是否还有更好的解决方案呢?
用的数据库驱动是:http://github.com/mapbox/node-sqlite3
先谢过了。
windows 还是linux环境?
Node.js 使用 SQLite 时遇到中文乱码
最近在处理一批数据的时候,发现插入中文之后会乱码。但以前系统插入中文非常正常,不会出现乱码。调查之后,从前台到后台都没问题,最后插入数据库的时候出错。发现是 %
在作怪。
示例代码
const sqlite3 = require('sqlite3').verbose();
// 打开数据库
let db = new sqlite3.Database(':memory:', (err) => {
if (err) {
return console.error(err.message);
}
console.log('Connected to the in-memory SQlite database.');
});
// 创建表
db.run(`CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
content TEXT
)`);
// 插入数据
let data = '中文测试 %';
db.run(`INSERT INTO test (content) VALUES (?)`, [data], function(err) {
if (err) {
return console.error(err.message);
}
console.log(`Inserted row with ID: ${this.lastID}`);
});
// 查询数据
db.all(`SELECT * FROM test`, [], (err, rows) => {
if (err) {
throw err;
}
rows.forEach((row) => {
console.log(row.content);
});
});
// 关闭数据库连接
db.close();
解决方案
-
检查字符集设置: 确保你的 SQLite 数据库和表使用正确的字符集。通常情况下,UTF-8 是最常用且兼容性最好的字符集。
CREATE TABLE test ( id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT CHARACTER SET utf8 );
-
替换特殊字符: 如果你怀疑某些特殊字符(如
%
)会导致问题,可以在插入之前进行替换。例如:let data = '中文测试 %'; data = data.replace(/%/g, '%%'); // 替换 `%` 为 `%%` db.run(`INSERT INTO test (content) VALUES (?)`, [data], function(err) { if (err) { return console.error(err.message); } console.log(`Inserted row with ID: ${this.lastID}`); });
-
使用参数化查询: 参数化查询可以避免 SQL 注入攻击,并确保数据正确地传递给数据库。在上面的示例代码中已经使用了参数化查询。
-
检查数据库驱动版本: 确保你使用的
node-sqlite3
驱动是最新的版本。有时旧版本可能存在一些已知的 bug 或不兼容问题。 -
调试日志: 在插入和查询过程中添加调试日志,查看具体的数据流,确认是否有乱码或其他异常情况。
通过以上方法,你应该能够解决 Node.js 使用 SQLite 时遇到的中文乱码问题。如果问题仍然存在,请提供更多详细的错误信息或代码片段,以便进一步排查。
你遇到的中文乱码问题可能与字符编码不一致有关。在使用 Node.js 操作 SQLite 数据库时,确保所有涉及的步骤都使用统一的字符编码(通常为 UTF-8)是非常重要的。
这里有一个简单的示例,演示如何正确设置和使用字符编码:
- 确保你的 Node.js 环境和 SQLite 数据库使用相同的字符编码(如 UTF-8)。
- 在连接 SQLite 数据库时设置字符编码。
以下是示例代码:
const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database('./database.db', (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to the database.');
});
// 设置字符编码为 UTF-8
db.run("PRAGMA encoding = 'UTF-8'");
// 插入数据
let data = '中文测试 %';
db.run(`INSERT INTO table_name (column_name) VALUES (?)`, [data], function(err) {
if (err) {
return console.error(err.message);
}
console.log(`A row has been inserted with rowid ${this.lastID}`);
});
// 关闭数据库连接
db.close((err) => {
if (err) {
return console.error(err.message);
}
console.log('Close the database connection.');
});
如果上述方法不能解决问题,请检查以下几点:
- 确保前端页面表单提交的数据编码为 UTF-8。
- 确保数据库中的表和列使用了 UTF-8 编码。
通过以上方法,你应该可以解决中文乱码问题。