Linux

使用 bash 執行 SQL*Plus 會導致錯誤編碼

  • May 15, 2018

我在 bash 中執行 SQL*Plus 時遇到問題。這是我的程式碼

#!/bin/bash

#curl http://192.168.168.165:8080/api_test/xsql/f_exp_order_1016.xsql > script.sql
wget -O script.sql 192.168.168.165:8080/api_test/xsql/f_exp_order_1016.xsql
set NLS_LANG=_.UTF8
sqlplus /nolog << ENDL
connect login/password 
set sqlblanklines on
start script.sql
exit
<<endl

我從我們的 Intranet 下載插入語句,將其放入 sql 文件並通過 SQL*Plus 執行它。這工作正常。我的問題是,當我保存文件 script.sql 時,我的編碼出錯了。所有特殊字元(如íášč)都被破壞,這導致在我的數據庫中插入錯誤的字元。該文件的編碼是 UTF-8,在我們內部網的 XSQL 頁面上也設置了 UTF-8。所以我真的不知道哪裡有問題。

歡迎對我的腳本提出任何建議,我是 Linux 腳本的新手:-)

好的,問題不在文件中(編碼應該是 UTF-8),而是在 Oracle NLS_LANG 環境變數的設置中。所以解決方案是在執行 SQL*Plus 腳本之前放置這一行

NLS_LANG="CZECH_CZECH REPUBLIC.UTF8" export NLS_LANG

您可能需要將插入內容轉換為 ISO8859 程式碼頁。檢查您的 Oracle 伺服器上使用的編碼。編碼應該看起來像“WE8ISO8859P1”或類似的東西,這將告訴正在使用的 ISO 程式碼頁。

您可以使用iconv或類似的東西將您的文件從 UTF-8 編碼轉換為 ISO8859 編碼,然後嘗試通過 SQL*Plus 執行它。

引用自:https://serverfault.com/questions/369951