【发布时间】:2017-09-01 12:35:04
【问题描述】:
我正在连接到 DB2 DB
$sql = 'CALL procedures.name(1,1,'text',1,1,'2017-08-30','2017-08-31',?,?)';
try {
$con = new PDO("idb:all_the_connections_stuu",'user','pass',
[
PDO::ATTR_PERSISTENT => FALSE,
PDO::ATTR_ERRMODE => PDO:ERRMODE_EXCEPTION,
PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,
PDO::ATTR_AUTOCOMMIT => 0
]
);
$stmt = $con->prepare($sql);
$stmt->bindParam(1, $errorNumber, PDO::PARAM_INT); //also trying without PDO::params
$stmt->bindParam(2, $errorCode, PDO::PARAM_STR, 800); //and with |PDO::PARAM_INPUT_OUTPUT
$stmt->execute(); //return *TRUE*
var_dump($errorNumber); //return NULL
var_dump($errorCode); //return NULL
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); //returns Error
$stmt->closeCursor();
$stmt = null;
} catch (PDOException $e) {
echo ($e->getMessage());
}
得到了这个错误:
Fatal error: Uncaught PDOException: SQLSTATE[57017]: <<Unknown error>>: -332
[IBM][CLI Driver][DB2] SQL0332N
Character conversion from the source code page "" to the target code page "" is not supported.
SQLSTATE=57017
(SQLFetchScroll[-332] at /home/user/shared/PDO_IBM-1.3.4/ibm_statement.c:1306) in /var/www/html/server/testsIBM/index.php:80
Stack trace:
#0 /var/www/html/server/testsIBM/index.php(80): PDOStatement->fetchAll(7, 0)
#1 {main}
thrown in /var/www/html/server/testsIBM/index.php on line 80
如果我用 db2_connect 连接
$con = db2_connect("DATABASE=DB2D;HOSTNAME=10.243.13.65;PORT=5000;PROTOCOL=TCPIP;USERNAME=asdf23;PASSWORD=asdfasf1","", "")
并输出 db2_client_info($con) 和 db2_server_info($con) 我看到来自客户端 = 819 的 CONN_CODEPAGE 和来自服务器 = 1208 的 DB_CODEPAGE。
如何在我的客户端中设置 CONN_CODEPAGE?我已经在 CentOs 语言环境中设置了 LANG,但仍然出现字符转换错误。
______更新:
当前 $LANG = en_US.utf8(也在 locale -a 我有 en_US、en_US.iso88591、en_US.iso885915、en_US.utf8)
无论 $LANG 设置什么,db2_client_info($con) 的输出还是一样的:
["APPL_CODEPAGE"]=>
int(819)
["CONN_CODEPAGE"]=>
int(819)
关于从源代码页面进行字符转换
同样的错误我正在使用 PHP+Apache。 Apache httpd.conf defaultCharset 设置不同的语言环境并没有改变任何东西。
在 php 代码中 setlocale 也不要更改任何内容。
我认为这个设置存储在其他地方,ibm_db2 或 pdo_ibm 驱动程序使用它。 =|
____upd2
我发现的唯一方法是从已安装的 db2 客户端更改 DB2CODEPAGE。但是我没有安装客户端。我正在使用内部库。
现在我安装了 v11.1.2fp2_linuxx64_client.tar.gz (1.03 GB)。但我不能 laucn db2 客户端。认为我需要另一个新问题 =\
____upd3
在使用 CentO、apache 语言环境进行所有操作之后 - 我仍然得到 -322 异常。无论我更改了什么 - db2_client_info($con) 仍然显示 819 CodePage。一切都很好,直到fetch()/fetchAll()
CentOs 7.3、带有 PDO_IBM 1.3.4 补丁的 PHP 7.1.8 和 ibm_db2。 但是我从 PECL 来源制作这个模块(因为服务器没有互联网连接)。
而且我的应用服务器上也没有安装任何 DB2 产品(这就是为什么我决定 CodePage 从 CentOs 语言环境获取)。从您的测试看来,DB2 data server client 是必需的?
【问题讨论】: