从节点到Postgres DB的查询不在UTF8中

时间:2019-01-29 10:11:04

标签: node.js postgresql utf-8

对于一个项目,我必须在JS(节点)中编码服务器,该服务器从Windows计算机上的数据库(Postgres)返回元素。

一切正常,连接正常,返回元素,但是我确实有编码问题。我的元素使用法语,因此服务器无法正确“看到”某些字母,例如“éàç”(我打印了结果)。控制台正在使用UTF8(我已经对其进行了测试),因此问题出在其他地方。

在我看来,这个问题来自查询到数据库(来自客户端的HTML和JS都可以,并且支持这些字母)。这是我的代码的一部分,该代码返回错误的内容。

var client = new pg.Client({
user: 'xx',
password: 'yy', 
database: 'phrases',
host: 'localhost', 
client_encoding: 'utf8',
port: '5432'
});
client.connect();

client.query('SELECT id,mots from phrase WHERE langue=$1 ORDER BY anno limit 20;', ['fr'])
.then(
  function(data){
    text = data.rows[0].mots; //<= return the text needed
    console.log(text);
  }
);

我几乎可以确定问题不是出在这部分代码上,而是数据库方面,但是我可能是错的(因此我看不到为什么)。在PSQL控制台中,我有:

show CLIENT_ENCODING; > UTF8
show SERVER_ENCODING; > UTF8

并且从数据库中:

    Nom    | PropriÚtaire | Encodage |      Collationnement       |    Type caract.    |     Droits d'acc
-----------+-------------+----------+----------------------------+--------------------+-----------------------
phrases   | postgres    | UTF8     | French_France.1252         | French_France.1252 |

我尝试了一个python程序(向数据库打印一个简单的请求),看结果是否相同;字母打印不好。因此,我确定问题出在数据库中,并且与编码相关联,但是无法找到有效的方法。

有人有主意吗?

最好

1 个答案:

答案 0 :(得分:0)

我知道这是一篇旧帖子,作者可能永远不会看到这个,但我认为应该为其他有此问题的人写一个答案。

我遇到了与您描述的问题非常相似的问题。显然,编码是正确的,但是当您执行 SELECT * FROM table 查询时,某些字母会呈现为乱码。这可能是因为 Windows 不会自动使用 UTF-8 编码。

在通过 cmd 进入您的数据库之前,您可以运行命令 chcp 65001。这会起作用,但通常被认为是低效和危险的。更好的解决方案是执行以下操作:

  1. 搜索应用运行并输入intl.cpl
  2. 转到 Administrative 标签
  3. 点击Change System Locale
  4. 选中左下角的框。

感谢@mklement0 的 this 回答