原本我的電腦已有python腳本連線Oracle資料庫並取得資料,當時是用python 2.7來執行,沒有什麼問題。
最近重灌系統之後,安裝Python 3.7、cx_Oracle套件、Oracle instant client 11.2,都是64位元的版本。
重新執行腳本時卻出現如下的錯誤訊息:
Database Version:11.2.0.4.0
Traceback (most recent call last):
File "F:\Ora_LineNotify\EBS_Check.py", line 107, in <module>
cur.execute(SQL02)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 45-46: ordinal not in range(128)
一開始以為是腳本編碼的問題,但是檢查過後文字是以UTF-8編輯的。
詳細看一下錯誤訊息,是在執行SQL2時出現的錯誤,而字串SQL2中只有一個地方有中文字,而且只要把中文改成英文,腳本又正常了
SQL02=("select to_char(start_time,'yyyy-mm-dd') as \"日期\",status " .....
所以可以確定是cx_Oracle的問題,於是更改搜尋的目標,找到了可能是NLS_LANG的問題。
我可以確定資料庫上是以AMERICAN_AMERICA.ZHT16BIG5來編碼,於python腳本中增加下列程式碼後又恢復正常了。
import os
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.ZHT16BIG5'
上面主要是設定系統的環境變數NLS_LANG