【问题标题】:Pg-promise client doesn't retrieve special characters properly from ElephantSQL cloud databasePg-promise 客户端无法从 ElephantSQL 云数据库中正确检索特殊字符
【发布时间】:2019-08-19 00:49:29
【问题描述】:

我目前正在编写一个使用 pg-promise 连接到 ElephantSQL 实例的 API。一切正常,除了文本列中的特殊字符(如重音字母)没有正确检索(即“Collège”一词在 JSON 对象中显示为“Collège”)。我想这与编码有关,但特殊字符在 ElephantSQL 的仪表板中正确显示,所以我认为数据库编码没有错误 - 尽管我首先找不到有关数据库编码的任何信息。所以我最好的猜测是,我需要向客户端添加一些东西来指定我希望得到结果的编码。我已经尝试调整client_encoding,如this page 中所述,使用utf8 和latin1,但无济于事。是我遗漏了什么还是我只是尝试了错误的编码?

更新

运行以下查询时:

SELECT * 
  FROM information_schema.character_sets;

我得到以下 JSON 对象:

{
character_set_catalog: null,
character_set_schema: null,
character_set_name: "UTF8",
character_repertoire: "UCS",
form_of_use: "UTF8",
default_collate_catalog: "ggnonllb",
default_collate_schema: null,
default_collate_name: null
}

所以我知道我的在线数据库是用 UTF8 编码的(正如人们所期望的那样)。但是即使我运行的每个查询都包含在SET CLIENT_ENCODING TO 'UTF8'; 中,我的问题也没有解决。所以我感到非常困惑。好像这与字符编码无关。但是,如果不是字符编码的问题,为什么 pg-promise 客户端会得到带有特殊字符加扰的结果呢?此外,这仅在检索数据时发生,而不是在发布数据时发生,因为特殊字符在 ElephantSQL 的仪表板中显示为应有的样子。

【问题讨论】:

  • 我刚刚用 pg-promise v9.0.0 进行了一次测试,首先是 insert into french(message) values('Collège'),然后是 select * from french,我看到的正是预期的结果。你使用的是什么版本的 pg-promise 和 PostgreSQL?也许这是 ElephantSQL 的问题。
  • 我正在使用 pg-promise v9.0.0。至于 PostgreSQL,我实际上没有安装版本,因为我使用的是 ElephantSQL - 我直接查询云数据库。也许值得注意的是,更改客户端编码有时会返回不同的特殊字符“加扰”(它们仍然无法正确显示,但方式不同),所以我想我走在正确的轨道上,但我不能'找不到可以给我所需输出的单一编码。
  • 根据那个问题示例,它是否有助于将请求包装在SET client_encoding to 'latin1'; 中?为此,您将使用带有 pg-promise 的任务。
  • 这就是我尝试过的,实际上我的所有查询都通过一个函数运行,该函数自动将它们包装在BEGIN 和COMMIT(或ROLLBACK 错误)中,我添加了SET CLIENT_ENCODING TO 'latin1';(或utf8 或其他)到包装。这就是不同的加扰发生的时候。
  • 如果即使在包装到该编码 SQL 之后它仍然无法工作,那么问题不在于pg-promise,而在于其他地方。这是我所能提供的帮助。

标签: postgresql character-encoding special-characters pg-promise


【解决方案1】:

实际上,我想通了。似乎这是响应的字符编码问题。当我从浏览器查询我的 API 时,特殊字符仍然没有按应有的方式显示,但是从我的应用程序调用时,一切都很好。

【讨论】:

  • 这正是我所怀疑的,您在某些中间层丢失了编码,并且与数据库无关。
猜你喜欢
  • 2020-05-13
  • 2015-04-30
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
相关资源
最近更新 更多