【问题标题】:iSeries Access ODBC Driver with unixodbc on Debian - Invalid UTF-8 characters being returned from iSeriesiSeries Access ODBC Driver with unixodbc on Debian - 从 iSeries 返回无效的 UTF-8 字符
【发布时间】:2019-05-29 15:30:04
【问题描述】:

在 Debian Linux 上使用 ODBC 驱动程序 ibm-iaccess-1.1.0.10-1.0.amd64。当我执行 php sql 查询并验证响应时,我看到返回的一些数据不是有效的 utf-8。

mb_check_encoding 返回“false”,Chrome 浏览器屏幕上的字符是菱形问号字符。

这发生在少数 CHAR 字段类型上。

if(!mb_check_encoding($row["field"])) {
 ... exit with utf-8 error
}

我可以通过将 UTF-8 转换为 UTF-8 来解决这个问题:

mb_convert_encoding($row["field"], 'UTF-8', 'UTF-8');

/etc/odbc.ini:

[as400]
Description = iSeries Access ODBC Driver
Driver = iSeries Access ODBC Driver
system = as400
Naming = 0
DefaultLibraries = *usrlibl
DefaultPkgLibrary = QGPL
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
ConnectionType = 0
CommitMode = 1
ExtendedDynamic = 1
AllowDataCompression = 1
AllowUnsupportedChar = 0
ForceTranslation = 1
Trace = 0
Charset = UTF-8

/etc/odbcinst.ini:

Description=IBM i Access for Linux 64-bit ODBC Driver
Driver=/usr/lib/libcwbodbc.so
Setup=/usr/lib/libcwbodbcs.so
fileusage=1
dontdlclose=1

此外,IBM 是否记录了任何 odbc 参数?这似乎是在盲目地尝试参数,直到有效果为止。

【问题讨论】:

  • Linux 上用于 PHP 会话的 LANG 变量的值是什么(即在启动 php 之前),或者 Linux 上的系统默认语言环境是什么?另外,对于有关表,它的编码也是 utf-8 吗?您是否为相关列选择了 HEX() 代码来验证编码?
  • 'locale' 输出:LANG=en_US.UTF-8 LANGUAGE= 我不确定如何选择 HEX() 代码进行验证,我不知道如何检查相关表是否有utf-8 编码。
  • 若要在显示不正确的列中显示十六进制值,请使用 select HEX(colname) from ... 其中 colname 是列名。要显示列编码,请查询目录,例如 select ccsid from qsys.syscolumns where table_name=? and table_owner=? and column_name=?(将您的值替换为每个?)
  • ccsid = 37 对于该字段,该字段的十六进制值为“4140404040404040404040404040404040404040404040404040404040404040404040”
  • 因此该列具有 EBCDIC 编码 (ccdis 37),并且该编码中的值 0x41 = 'A' 和 0x40='@'。我希望正确渲染。如果您选择 columnName, hex(columnname) 字符是否正确呈现?这个想法是找到一个不正确呈现的列值,然后检查它的编码并比较它是如何呈现的。有时列具有与编码相关的错误数据。如果任何列具有 ccsid 1200(utf-16) 或 ccsid 1208 (utf-8) 或 ccsid 13488 (ucs-2),请检查这些列是否受到影响。

标签: db2 odbc ibm-midrange db2-400 unixodbc


【解决方案1】:

OS/400 的单字节安装始终通过 ODBC 向 Linux 返回 Latin1 字符集。这是我对非常旧版本(V4)的经验。几个月前我深入研究了文档,它似乎仅通过 DBCS-Install 提供 UTF-8。

我不能说这对于当前版本的 i 是否仍然适用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多