【问题标题】:php pdo connected to DB2 different CODEPAGEphp pdo 连接到 DB2 不同的 CODEPAGE
【发布时间】: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_db2pdo_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 是必需的?

【问题讨论】:

    标签: php pdo db2


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

    有关信息:

    在 ubuntu 16.04 LTS - appl_codepage = conn_codepage = db_codepage 上测试了 PHP 7.0.20 和 PDO_IBM 1.3.4 补丁,以及 ibm_db2 和 DB2 V11.1.2.2。

    还在 RHEL 6.9 上测试了带有 PDO_IBM 1.3.4 补丁的 PHP 5.3.3 和带有 DB2 V10.5.0.7 的 ibm_db2:appl_codepage = conn_codepage = db_codepage。

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

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

    【讨论】:

    • 已经完成了,没有帮助。错误是一样的。 CONN_CODEPAGE 还是一样..
    • 有趣的事情。无论语言环境中的 LANG 设置 - db2_client_info($con) 仍然显示 CODEPAGE = 819。所以这个代码页设置在其他地方,也许在其他一些设置中......
    • 您需要确定 Php/DB2 中涉及的任何进程的环境都获得了 $LANG 的新值。请同时显示您的新 $LANG 值,并更新问题以显示用于 ODBC 和 CLI 的 DB2 驱动程序的确切版本。
    • 哪个账户运行 Apache 服务和 PHP/PDO 服务?如果您 su 到这些帐户并显示 $LANG,值是 "en_US.utf8" 吗?将 LANG 更改为 en_US.utf8 后您是否重新启动了这些服务?
    【解决方案2】:

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

    使源代码页和目标代码页相互兼容。 搜索DB2 information Center 使用短语 “代码集区域代码”用于支持的 DB2 代码的兼容性 页。设置客户端的代码页与数据库代码兼容 页面:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-01
      • 2015-05-18
      • 1970-01-01
      • 2012-10-06
      • 2015-03-10
      • 1970-01-01
      • 2018-10-29
      • 2013-03-27
      • 2014-02-02
      相关资源
      最近更新 更多