php pdo连接到DB2不同的CODEPAGE

时间:2017-09-01 12:35:04

标签: php pdo db2

我正在连接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(也在 locale -a 我有en_US,en_US.iso88591,en_US.iso885915,en_US.utf8)

无论来自 db2_client_info($ con)的$ LANG设置输出仍然相同:

 ["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源创建此模块(导致服务器没有互联网连接)。

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

2 个答案:

答案 0 :(得分:1)

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

  

使源代码页和目标代码页彼此兼容。   搜索DB2 information Center    用这句话   “代码集区域代码”,用于支持的DB2代码的兼容性   页面。设置客户端的代码页与数据库代码兼容   页:

     

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

     

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

     

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

答案 1 :(得分:1)

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

有关信息:

使用PDO_IBM 1.3.4-patched测试PHP 7.0.20,使用DB2 V11.1.2.2在ibum_db2上测试ubuntu 16.04 LTS - 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编码。