【问题标题】:I got garbled character with ibm_db@2.6.1 in nodejs project我在 nodejs 项目中使用 ibm_db@2.6.1 得到了乱码
【发布时间】:2019-09-20 00:30:59
【问题描述】:

我正在做一个 nodejs 项目。 DB2 中有公司名称“ABC AEROLÍNEAS SA DE CV”。在使用 ibm_db@2.6.1 获取名称时,它在我的 nodejs 中变成了“ABC AEROL�NEAS SA DE CV”。

我尝试通过将 python 与 ibm_db 3.0.1 一起使用来验证它并得到“ABC AEROL\xcdNEAS SA DE CV”。我认为 '\xcd' 应该是正确的,因为它在 python 控制台中显示 'ABC AEROLÍNEAS SA DE CV'。此外,我通过 JDBC 对其进行了测试,并得到了正确的名称。

不知道为什么nodejs的ibm_db不能取到正确的名字。有人可以帮忙检查一下吗?谢谢。

数据库 DB

NodeJS NodeJS

Python Python

【问题讨论】:

  • 你的 Node.js 应用的数据库代码页和代码页是什么?
  • 您正在处理非 ASCII 字符串,因此您的代码需要更新以处理字符集编码,即从外部编码 (DB) 转换为内部编码 (code) 到外部编码 (显示)。
  • @StefanBecker 数据库连接字符串没有字符集属性。即使我添加了 charset=UTF8,它也不起作用。我也尝试过转换公司名称的编码,但没有得到正确的结果。
  • @StefanBecker 奇怪的是,ibm_db 正在努力在 Mac 中获取正确的名称,而不是在 Win10 中。是DB驱动的bug吗?

标签: node.js character-encoding db2 loopback dashdb


【解决方案1】:

十六进制值\xCD 是一个(扩展的)ASCII 值。在 UTF-8 中,您需要 \xC3\x8D。在 UTF-16 中,您需要 \x00\xCD

https://en.wikipedia.org/wiki/%C3%8D#Character_mappings

请注意,某些 Windows 本地程序会将无效的 UTF-8 字节显示为有效字符,但严格来说它们应该显示 或类似字符。

如果您使用基于 JDBC 的 SQL 编辑器,您会在字符串中看到 �(或空值)

【讨论】:

  • 我认为数据应该正确地存储在 DB2 中。我用 DBevaer 检查了它。我不知道如何在这里添加图像。所以在下面添加快照链接。 user-images.githubusercontent.com/31400781/…
  • 可以在列上使用HEX()查看SQL中列值的字节编码
  • 您还可以通过SYSCAT.COLUMNS的CODEPAGE列查看某一列的代码页
  • 使用 HEX()?像那样? ``` 从 GLOBALITOTID='GB227V69' 的 CEUI.ACCOUNT 中选择 GLOBALITOTID、COMPANY_FULL_NAME、HEX(COMPANY_FULL_NAME) ``` GLOBALITOTID|COMPANY_FULL_NAME |3 | ------------|------------------------|------------- ----------------------------------| GB227V69 |ABC AEROLÍNEAS SA DE CV|414243204145524F4CC38D4E454153205341204445204356|
  • 所以 C38D 是你的 Í 并且是完全正确的 UTF-8。所以问题不在于数据如何存储在 DB2 中(假设这是一个 1208 代码页列)
猜你喜欢
  • 1970-01-01
  • 2022-10-08
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多