如何在SQL查询中修复字符编码

时间:2019-04-24 09:24:48

标签: sql encoding db2

我有一个db2数据库,用于存储包含特殊字符的名称。当我尝试使用内部软件检索它们时,会得到正确的结果。但是,当我尝试对查询执行同样的操作或查看数据库时,字符被奇怪地存储了。

文档说编码是utf-8 latin1。 我的查询看起来像这样:

SELECT firstn, lastn
FROM unams
WHERE unamid = 12345

具有给定ID的用户的名称中有一些特殊字符:éó,但查询将其返回为Ă©Ăł

是否可以使用一些简单的SQL函数将字符转换回其原始格式?我是数据库和编码的新手,试图通过阅读this来理解后者,但是我很迷茫。

编辑:当前通过带有适当ODBC驱动程序的SPSS Modeler发送查询,该数据库位于Windows Server 2016上

2 个答案:

答案 0 :(得分:1)

根据注释,解决方案是创建Windows环境变量DB2CODEPAGE = 1208,然后重新启动,然后删除并重新填充表。

如果应用程序在Db2服务器上本地运行(即仅涉及一个主机名),则可以设置相同的变量。这将影响所有使用UTF-8编码数据库的本地应用程序。

如果应用程序是从Db2服务器远程运行的(即涉及两个主机名),则在工作站和Windows Db2服务器上设置变量。

Windows上的IBM提供的Db2-client的当前版本将从区域设置中derive their codepage出发,这些设置可能并不总是正确地呈现Unicode字符,因此使用DB2CODEPAGE = 1208会强制Db2-client CLI驱动程序使用Unicode应用程序代码页来覆盖它。

答案 1 :(得分:0)

with t (firstn) as (
values ('éó')
--SELECT firstn
--FROM unams
--WHERE unamid = 12345
)
select x.c, hex(x.c) c_hes
from 
  t
, xmltable('for $id in (1 to string-length($s)) return <i>{substring($s, $id, 1)}</i>' 
passing t.firstn as "s" columns tok varchar(6) path '.') x(c);

C C_HEX
- -----
é C3A9
ó C3B3

上面的查询将字符串转换为表格,并在每行中包含每个字符(C)及其十六进制表示形式(C_HEX)。
您可以按原样运行它,以检查是否获得相同的输出。必须与针对UTF-8数据库的描述相同。
现在尝试用values ('éó')注释掉该行,并取消注释select语句,返回包含这些特殊字符的某些行。

如果您在firstn列中看到了与这些字符相同的十六进制表示,则意味着该字符串已正确存储,但是由于以下原因,您的客户端工具(SPSS Modeller)无法正确显示这些字符由于某种原因(例如,错误的字体)。