php連Oracle中文亂碼問題
最近使用php操作Oracle,遇到中文亂碼問題。最後在大家集思廣益下,把問題解決了,做個紀錄…
原以為使用php去連Oracle,應該和其他資料庫一樣,在連線時,設定正確的字元集(character_set)。再將轉碼過的中文寫入資料庫即可。沒想到,Oracle有點不同…
php如何設定Oracle?在官方資料 - Configuring PHP with OCI8,於Setting the Oracle Environment這章節中提到需要設定環境變數(Common Oracle Environment Variables),如下…
- ORACLE_HOME
- ORACLE_SID
- LD_LIBRARY_PATH
- NLS_LANG
- ORA_SDTZ
- TNS_ADMIN
經過測試後,我們遇到中文亂碼的問題,只需要設定ORACLE_HOME、NLS_LAN即可。
當然,下述參數的設定值,需視機器環境作調整。
- setenv NLS_LANG AMERICAN_AMERICA.UTF8
- 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
附註:
Warning: oci_new_connect(): Error while trying to retrieve text for error ORA-12705
- 設定好環境變數,apache也可以吃到。如果沒吃到,則需要在httpd.conf中設定
- 安裝OCI8後,無意間發現在CLI中執行php,只要程式有連結Oracle,當程式執行完後,就會出現Segmentation fault的訊息。 :(
留言