我有一个db2数据库,用于存储包含特殊字符的名称。当我尝试使用内部软件检索它们时,会得到正确的结果。但是,当我尝试对查询执行同样的操作或查看数据库时,字符被奇怪地存储了。
文档说编码是utf-8 latin1。 我的查询看起来像这样:
SELECT firstn, lastn
FROM unams
WHERE unamid = 12345
具有给定ID的用户的名称中有一些特殊字符:é和ó,但查询将其返回为Ă©和Ăł。
是否可以使用一些简单的SQL函数将字符转换回其原始格式?我是数据库和编码的新手,试图通过阅读this来理解后者,但是我很迷茫。
编辑:当前通过带有适当ODBC驱动程序的SPSS Modeler发送查询,该数据库位于Windows Server 2016上
答案 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)无法正确显示这些字符由于某种原因(例如,错误的字体)。