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
请教一下各位大侠这种情况如何解决?
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 查询中文字符时,可能会遇到编码问题。通常,这是因为数据库连接没有正确设置字符集。可以通过以下步骤来解决这个问题:
- 确保数据库文件使用正确的编码:可以在创建数据库时指定编码(例如 UTF-8)。
- 在连接数据库时设置编码:在打开数据库连接时设置合适的编码。
修改后的代码示例:
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)来查看和确认数据库中的数据编码。