连接到DB2不同代码页的php pdo
我正在连接到DB2DB连接到DB2不同代码页的php pdo,php,pdo,db2,Php,Pdo,Db2,我正在连接到DB2DB $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::AT
$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\u client\u info($con)
和db2\u server\u info($con)
我看到client=819的CONN\u代码页和server=1208的DB\u代码页
如何在客户机中设置CONN\u CODEPAGE?我已经在CentOs语言环境中设置了LANG,但仍然出现字符转换错误
______upd:
当前$LANG=en_US.utf8(也在区域设置中-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。apachehttpd.confdefaultCharset设置不同的区域设置不会改变任何东西
在php代码中,setlocale也不要更改任何内容
我认为这个设置存储在其他地方,ibm_db2或pdo_ibm驱动程序使用它=|
____upd2
我发现的唯一方法是从已安装的db2客户机更改DB2CODEPAGE。但我没有安装客户端。我正在使用inly库
现在我安装了v11.1.2fp2_linux64_client.tar.gz(1.03 GB)。但我不能启动db2客户机。我想我还需要一个新问题=\
____upd3
在使用CentOs进行了所有操作之后,apache locales-我仍然得到了-322异常。不管我做了什么更改,db2_client_info($con)仍然显示819代码页。在fetch()/fetchAll()
CentOs 7.3、PHP7.1.8和PDO_IBM 1.3.4补丁,以及IBM_db2但我从PECL来源制作此模块(因为服务器没有internet连接)
我也没有在我的应用服务器上安装任何DB2产品(这就是为什么我决定从CentOs语言环境获取代码页)。从您的测试来看,似乎需要
DB2数据服务器客户端
?您可能会发现,尝试所描述的技巧非常有用,特别是:
使源代码页和目标代码页相互兼容。
搜索
使用短语
“代码集区域代码”用于支持的DB2代码的兼容性
页。设置客户端代码页与数据库代码兼容的步骤
第页:
在Unix平台上,设置LANG、LC_CTYPE或LC_ALL环境
变量设置为代码页与数据库兼容的区域设置
代码页。请参阅平台文档以查看有效的区域设置
名称及其关联的代码页
在窗户上
在平台上,设置DB2CODEPAGE注册表变量以覆盖
具有与数据库代码兼容的值的客户端代码页
页面
有关数据库管理器代码页支持,请搜索
使用短语
“代码集区域代码”。对于联邦系统用户,请参阅
数据源代码页的联邦系统指南。如果源和
目标代码页是兼容的,那么DB2目前不支持
这个特殊的代码页转换。联系您的技术服务
代表确定是否可以添加此类支持
如果您专门为Centos客户端使用“IBM DB2 Data server driver for ODBC和CLI”,则可以尝试确保运行PDO并连接到DB2的帐户的环境具有DB2CODEPAGE=1208。您可以通过以下方式导出此变量(仅适用于此特定客户端类型):
并重新启动解决方案中涉及的任何进程
另外,对于用于连接DB2的帐户,其客户机LANG设置应该是UTF-8语言环境(该语言环境需要安装在Centos上)。使用命令locale-a
显示已安装的区域设置,并选择一个具有适用于您所在地区的utf-8。例如,如果您的$LANG是en_us,则如果安装了该区域设置,则将其更改为en_us.utf-8。在相关帐户的shell启动中导出$LANG并重新启动应用程序
如果您使用的是全DB2客户机(或unix上DB2服务器上的本地DB2客户机),那么还需要将LANG变量正确设置为与DB2数据库编码兼容的值。否则,您将在运行时获得代码页转换,这可能会产生意外的结果,如果不存在合适的转换,则会出现异常
有关信息:
在Ubuntu16.04 LTS-appl_codepage=conn_codepage=db_codepage上测试了PHP7.0.20和PDO_IBM 1.3.4-patched,以及IBM_db2和db2 V11.1.2.2
还测试了PHP5.3.3和PDO_IBM 1.3.4-patched,以及IBM_db2和DB2V10.5.0.7在RHEL6.9上的代码:appl_codepage=conn_codepage=db_codepage
还使用PDO_IBM 1.3.4补丁和IBM_db2,以及DB2V11.1.2.2数据服务器客户端,在CENTOS 7.3上测试了PHP5.4.16:appl_codepage=conn_codepage=db_codepage
注意:在从github构建pdo_ibm或使用pecl安装ibm_db2之前,Ubuntu、RHEL和Centos为utf-8设置了默认的语言环境。所有本地和远程数据库都有utf-8编码。已经这样做了,没有帮助。错误是一样的。CONN_代码页仍然是一样的..有趣的事。不管语言环境中的LANG设置是什么,db2_client_info($con)仍然显示代码页=819。因此,此代码页设置在其他地方,可能在其他一些设置中…您需要确保Php/DB2中涉及的任何进程的环境都会获取$LANG的新值。请同时显示新的$LANG值,并更新问题,以显示用于ODBC和CLI的DB2驱动程序的确切版本。哪个帐户运行Apache服务和PHP/PDO服务?如果您转到这些帐户并显示$LANG,值是否为“en_US.utf8”?在将LANG改为en_US.utf8后,您是否重新启动了这些服务?请使用谷歌。或
["APPL_CODEPAGE"]=>
int(819)
["CONN_CODEPAGE"]=>
int(819)
export DB2CODEPAGE=1208