2017-08-08 188 views
2

這裏是我的PHP代碼如何PDO的Oracle(OCI)字符集設置爲UTF-8

$tns = " 
(DESCRIPTION = 
     (ADDRESS_LIST = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) 
    ) 
     (CONNECT_DATA = 
      (SERVICE_NAME = myservice) 
    ) 
)"; 
$conn = new PDO("oci:dbname=" . $tns, 'user', 'pass'); 

當我嘗試的字符集設置爲UTF-8這樣的:

$conn = new PDO("oci:dbname=" . $tns . ";charset=UTF8", 'user', 'pass'); 

將獲得: ERROR: SQLSTATE[HY000]: OCINlsCharSetNameToId: unknown character set name (/app/software/php-5.6.30/ext/pdo_oci/oci_driver.c:610)pdo is NULL

我已經設置NLS_LANG爲AMERICAN_AMERICA.UTF8,但看起來像我的主機需要重新啓動,我現在不能這樣做。

那麼,我應該怎麼做可以改變字符集utf8連接到oracle數據庫的pdo/oci?

而且我想:

  1. 修改甲骨文DATABSE字符集
  2. ONLY使用PDO,而不是oci_connect
  3. 重新啓動我的主機
+0

你的Oracle數據庫是什麼版本?您可能需要使用'AL32UTF8'而不是 – Phil

+0

Oracle版本是11g。 '$ conn = new PDO(「oci:dbname =」。$ tns。「; charset = AL32UTF8」,'user','pass');'得到同樣的錯誤。 – KaKa

回答

0

花4個小時解決這個問題:

  1. 通過命令修改/etc/sysconfig/httpd文件vim /etc/sysconfig/httpd
  2. 在這個文件的末尾

    export LD_LIBRARY_PATH=/app/oracle/orahome/lib 
    export ORACLE_HOME=/app/oracle/orahome 
    export NLS_LANG=AMERICAN_AMERICA.UTF8 
    
  3. 重啓Apache通過命令service httpd restart

你要做添加以下代碼沒有關於您的pdooraclehost machine。 如果您不知道變量的值,只需在命令行中輸入echo $ORACLE_HOME即可。

BTW,

所有這三個變量應/ect/profile進行設置,你最好讓他們在相同的這兩個文件。

+0

請注意,「UTF8」字符集對於UCSE-8編碼而言是不恰當的。真正的UTF-8是字符集「AL32UTF8」然而,只要你留在unicode BMP他們是相同的。 –

+0

http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html中有關於如何爲PHP OCI8設置環境變量的部分。它也適用於PDO_OCI。如果您使用php-fpm,請注意,PDO_OCI會受到php-fpm'buglet'的影響,這會阻止PHP在讀取php-fpm配置文件之後纔會初始化PDO_OCI,請參閱https://bugs.php.net/bug.php ?id = 74631 –

+0

感謝提醒@WernfriedDomscheit – KaKa

相關問題