Nodejs 使用 sqlite 时 遇到 中文乱码

Nodejs 使用 sqlite 时 遇到 中文乱码

最近在处理一批数据的时候,发现插入中文之后会乱码。但以前系统插入中文非常正常,不会出现乱码。 调查之后,从前台到后台都没问题,最后插入数据库的时候出错。发现是 % 在作怪。

比如要向数据库插入 中文测试 % 插入数据库之后,就会变成 -�K� %

而通过 SqliteDev 直接操作数据库却没有任何问题,无论是中文还是 % 都正常插入了数据库。 自己调查之后,也没有发现原因所在,Google 之后也找不到类似的案例,不知道这是什么原因造成的?

现在自己所能想到的是在插入数据库的时候,替换 % ,再插入数据库。不知道是否还有更好的解决方案呢?

用的数据库驱动是:http://github.com/mapbox/node-sqlite3

先谢过了。


4 回复

最近在处理一批数据的时候,发现插入中文之后会乱码。但以前系统插入中文非常正常,不会出现乱码。 调查之后,从前台到后台都没问题,最后插入数据库的时候出错。发现是 % 在作怪。

比如要向数据库插入 中文测试 % 插入数据库之后,就会变成 -�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();

解决方案

  1. 检查字符集设置: 确保你的 SQLite 数据库和表使用正确的字符集。通常情况下,UTF-8 是最常用且兼容性最好的字符集。

    CREATE TABLE test (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        content TEXT CHARACTER SET utf8
    );
    
  2. 替换特殊字符: 如果你怀疑某些特殊字符(如 %)会导致问题,可以在插入之前进行替换。例如:

    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}`);
    });
    
  3. 使用参数化查询: 参数化查询可以避免 SQL 注入攻击,并确保数据正确地传递给数据库。在上面的示例代码中已经使用了参数化查询。

  4. 检查数据库驱动版本: 确保你使用的 node-sqlite3 驱动是最新的版本。有时旧版本可能存在一些已知的 bug 或不兼容问题。

  5. 调试日志: 在插入和查询过程中添加调试日志,查看具体的数据流,确认是否有乱码或其他异常情况。

通过以上方法,你应该能够解决 Node.js 使用 SQLite 时遇到的中文乱码问题。如果问题仍然存在,请提供更多详细的错误信息或代码片段,以便进一步排查。

你遇到的中文乱码问题可能与字符编码不一致有关。在使用 Node.js 操作 SQLite 数据库时,确保所有涉及的步骤都使用统一的字符编码(通常为 UTF-8)是非常重要的。

这里有一个简单的示例,演示如何正确设置和使用字符编码:

  1. 确保你的 Node.js 环境和 SQLite 数据库使用相同的字符编码(如 UTF-8)。
  2. 在连接 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 编码。

通过以上方法,你应该可以解决中文乱码问题。

回到顶部