Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接到DB2不同代码页的php pdo_Php_Pdo_Db2 - Fatal编程技术网

连接到DB2不同代码页的php pdo

连接到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

我正在连接到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::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_db2pdo_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