Nodejs + sqlite3 查询中文不显示的问题

Nodejs + sqlite3 查询中文不显示的问题

初学node,想用express + sqlite3 做一个小项目,没想到在用 sqlite3 的时候查询出了问题 ###环境如下

  • OS win64
  • node v0.10.28
  • sqlite3 2.2.3 ###表结构: table : todo id : int pk title : varchar(100) ###已有数据: id title 1 起床 2 洗刷

###nodejs 代码

var sqlite3 = require(‘sqlite3’).verbose(); var db = new sqlite3.Database(‘todo.db’); db.all(‘select title from todo’,function(err,rows){
rows.forEach(function(row){
console.log(row.title);
}); });

这样结果 是 2行 空,如果把title 换成 id 则能正确打印 为 1 2

请教一下各位大侠这种情况如何解决?


4 回复

Nodejs + sqlite3 查询中文不显示的问题

环境如下

  • OS: win64
  • node: v0.10.28
  • sqlite3: 2.2.3

表结构

CREATE TABLE todo (
    id INTEGER PRIMARY KEY,
    title VARCHAR(100)
);

已有数据

id title
1 起床
2 洗刷

问题描述

使用以下的 Node.js 代码查询 title 字段时,输出为空。而查询 id 字段时则可以正常输出。

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('todo.db');

db.all('SELECT title FROM todo', function(err, rows) {
    if (err) {
        console.error(err.message);
        return;
    }
    rows.forEach(function(row) {
        console.log(row.title);
    });
});

// 如果将 SQL 查询改为 SELECT id FROM todo,则可以正常输出 id。

解决方案

在 Windows 上使用 sqlite3 查询中文字符时,可能会遇到编码问题。通常,这是因为数据库连接没有正确设置字符集。可以通过以下步骤来解决这个问题:

  1. 确保数据库文件使用正确的编码:可以在创建数据库时指定编码(例如 UTF-8)。
  2. 在连接数据库时设置编码:在打开数据库连接时设置合适的编码。

修改后的代码示例:

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('todo.db');

// 设置数据库连接的编码
db.serialize(function() {
    db.run("PRAGMA encoding = 'UTF-8'"); // 设置数据库编码为 UTF-8
});

db.all('SELECT title FROM todo', function(err, rows) {
    if (err) {
        console.error(err.message);
        return;
    }
    rows.forEach(function(row) {
        console.log(row.title);
    });
});

通过以上代码,我们首先设置了数据库连接的编码为 UTF-8,然后再执行查询操作。这样可以确保查询到的中文字符能够正确显示。

总结

在使用 Node.js 和 sqlite3 进行中文查询时,需要确保数据库连接的编码设置正确。通过在连接数据库后设置 PRAGMA encoding = 'UTF-8',可以解决中文字符无法正确显示的问题。


你可以先找个工具看看你的数据库里面的数据是否是正常的。

下面的代码是可以正常工作的。

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(':memory:');   
// 或者
// var db = new sqlite3.Database('todo.db');  

db.serialize(function() { // 建表 db.run(“CREATE TABLE IF NOT EXISTS todo (title TEXT)”);

// 插入数据 var stmt = db.prepare(“INSERT INTO todo(title) VALUES (?)”); stmt.run(‘起床’); stmt.run(‘洗刷’); stmt.finalize();

db.all(“SELECT rowid AS id, title FROM todo”, function(err, rows) { console.log(rows); // [ { id: 1, title: ‘起床’ }, { id: 2, title: ‘洗刷’ } ] rows.forEach(function (row) { console.log(row.title); }); });

// 或者 // db.each(“SELECT rowid AS id, title FROM todo”, function(err, row) { // console.log(row.id + ": " + row.title); // }); });

db.close();

你好?请问你的问题解决了麽?我现在也遇到这个问题,新手,不知道如何解决这个问题。。。

在使用 Node.js 和 sqlite3 进行中文查询时遇到的问题通常与字符编码有关。你需要确保 sqlite3 数据库、连接以及查询结果的字符编码一致,通常需要设置为 UTF-8 编码。

以下是一个修正后的代码示例:

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('todo.db', (err) => {
    if (err) {
        console.error('Error opening database:', err.message);
    } else {
        console.log('Connected to the todo database.');
    }
});

db.serialize(() => {
    db.all('SELECT title FROM todo', [], (err, rows) => {
        if (err) {
            throw err;
        }

        rows.forEach((row) => {
            console.log(row.title);
        });
    });
});

db.close((err) => {
    if (err) {
        console.error('Error closing database:', err.message);
    } else {
        console.log('Closed the todo database.');
    }
});

在这个示例中,确保了数据库连接打开时正确处理错误,并且在查询完成后关闭数据库连接。此外,确保你的 todo.db 数据库文件本身以正确的编码创建,并且存储的数据也是正确的编码。

如果你仍然遇到问题,检查 todo.db 文件是否是以 UTF-8 编码创建的。你可以使用 SQLite 工具(如 DB Browser for SQLite)来查看和确认数据库中的数据编码。

回到顶部