【发布时间】: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