php pdo连接到DB2不同的CODEPAGE

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php pdo连接到DB2不同的CODEPAGE相关的知识,希望对你有一定的参考价值。

我正在连接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)我看到来自client = 819的CONN_CODEPAGE和来自server = 1208的DB_CODEPAGE。

如何在我的客户端设置CONN_CODEPAGE?我已在CentOs语言环境中设置LANG,但仍然出现字符转换错误。

______upd:

当前$ LANG = en_US.utf8(也在语言环境中 - 我有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。但我没有安装客户端。我正在使用inly库。

现在我安装了v11.1.2fp2_linuxx64_client.tar.gz(1.03 GB)。但我不能laucn db2客户端。认为我需要另一个新问题=

____upd3

在使用CentOs进行所有操作之后,apache语言环境 - 我仍然得到-322异常。无论我改变什么 - db2_client_info($ con)仍然显示819 CodePage。所有工作都很好,直到fetch()/fetchAll()

CentOs 7.3,PHP 7.1.8,PDO_IBM 1.3.4-patched和ibm_db2。但我从PECL源创建此模块(导致服务器没有Internet连接)。

我也没有在我的应用程序服务器上安装任何DB2产品(这就是为什么我认为CodePage从CentOs locale获得)。从您的测试看来,需要DB2 data server client

答案

如果您专门为Centos客户端使用“用于ODBC和CLI的IBM DB2数据服务器驱动程序”,则可以尝试确保运行PDO并连接到DB2的帐户的环境具有DB2CODEPAGE = 1208。您可以通过以下方式导出此变量(仅适用于此特定客户端类型):

export 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数据库的编码兼容的值。否则,您将在运行时获得代码页转换,这可能会产生意外结果,如果不存在合适的转换,则包括异常。

有关信息:

在Ubuntu 16.04 LTS上测试了带有PDO_IBM 1.3.4-patched的PHP 7.0.20和带有DB2 V11.1.2.2的ibm_db2 - appl_codepage = conn_codepage = db_codepage。

还在RHEL 6.9上使用PDO_IBM 1.3.4-patched和ibm_db2以及DB2 V10.5.0.7测试了PHP 5.3.3:appl_codepage = conn_codepage = db_codepage。

还在CENTOS 7.3上使用PDO_IBM 1.3.4-patched和ibm_db2以及DB2 V11.1.2.2数据服务器客户端测试了PHP 5.4.16:appl_codepage = conn_codepage = db_codepage。

注意:在从github构建pdo_ibm或使用pecl安装ibm_db2之前,Ubuntu,RHEL,Centos都为utf-8设置了默认语言环境。所有本地和远程数据库都具有utf-8编码。

另一答案

您可能会发现,尝试here (with more explanations)描述的提示非常有用,特别是:

使源代码页和目标代码页彼此兼容。使用短语“Code set Territory code”搜索DB2 information Center,以获得受支持的DB2代码页的兼容性。要设置客户端的代码页与数据库代码页兼容:

在Unix平台上,将LANG,LC_CTYPE或LC_ALL环境变量设置为其代码页与数据库代码页兼容的语言环境。请参阅平台文档以查看有效的区域设置名称以及与每个区域名称关联的代码页。

在Windows平台上,设置DB2CODEPAGE注册表变量以使用与数据库代码页兼容的值覆盖客户端的代码页。

对于数据库管理器代码页支持,使用短语“代码集区域代码”搜索DB2 information Center。对于联合系统用户,请参阅“联合系统指南”了解数据源代码页。如果源代码页和目标代码页兼容,那么DB2当前不支持此特定代码页转换。请与您的技术服务代表联系,以确定是否可以添加此类支持。

以上是关于php pdo连接到DB2不同的CODEPAGE的主要内容,如果未能解决你的问题,请参考以下文章

PDO连接到ODBC iseries无法正常工作

使用 PDO 连接到本地数据库时遇到问题 [重复]

使用 PDO 连接到 Sybase 的正确 DSN

如何通过 PHP 和 Linux 使用 pdo 连接到 mssql?

无法使用 pdo 连接到 mysql

通过 PDO ODBC 将 PHP 连接到 MSSQL