php連Oracle中文亂碼問題

最近使用php操作Oracle,遇到中文亂碼問題。最後在大家集思廣益下,把問題解決了,做個紀錄…

原以為使用php去連Oracle,應該和其他資料庫一樣,在連線時,設定正確的字元集(character_set)。再將轉碼過的中文寫入資料庫即可。沒想到,Oracle有點不同…

php如何設定Oracle?在官方資料 - Configuring PHP with OCI8,於Setting the Oracle Environment這章節中提到需要設定環境變數(Common Oracle Environment Variables),如下…

  1. ORACLE_HOME
  2. ORACLE_SID
  3. LD_LIBRARY_PATH
  4. NLS_LANG
  5. ORA_SDTZ
  6. TNS_ADMIN

經過測試後,我們遇到中文亂碼的問題,只需要設定ORACLE_HOME、NLS_LAN即可。
當然,下述參數的設定值,需視機器環境作調整。

  1. setenv NLS_LANG AMERICAN_AMERICA.UTF8  
  2. setenv ORACLE_HOME /usr/local/oracle8-client  

另外,開啟Oracle連線時的字元集(character_set),其實可以不用設定。php會採用上述NLS_LANG的設定值。不過,有設定會比較好。詳細說明請見PHP: oci_connect - Manual中,對於character_set的說明。

如果…連線時的字元集設定錯,可能會看到如下的兩種錯誤訊息…

Warning: oci_new_connect(): ORA-12705: invalid or unknown NLS parameter value specified
Warning: oci_new_connect(): Error while trying to retrieve text for error ORA-12705

附註:
  • 設定好環境變數,apache也可以吃到。如果沒吃到,則需要在httpd.conf中設定
  • 安裝OCI8後,無意間發現在CLI中執行php,只要程式有連結Oracle,當程式執行完後,就會出現Segmentation fault的訊息。 :(

留言