Я подключаюсь к 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)
Я вижу, что CONN_CODEPAGE из client = 819 и DB_CODEPAGE с сервера = 1208.
Как установить CONN_CODEPAGE в моем клиенте? Я уже установил LANG в локау CentOs, но все же получил ошибку преобразования символов.
______upd:
Текущий $ 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 по умолчанию. Настройка разных локалей ничего не изменила.
В php-коде setlocale ничего не меняет.
Я думаю, что этот параметр хранится где-то в другом месте, а драйверы ibm_db2 или pdo_ibm используют его. = |
____upd2
Единственный способ, которым я узнал, – изменить DB2CODEPAGE с установленного клиента db2. Но у меня нет установленного клиента. Я использую библиотеки.
Теперь я установил v11.1.2fp2_linuxx64_client.tar.gz (1.03 GB). Но я не могу почитать клиента 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). По вашему тесту, кажется, что DB2 data server client
требуется?