2011-04-06 38 views
2

我們在基本ASCII集之外的字符出現問題,這些字符在我們的Oracle 10g數據庫中顯示爲顛倒的問號。Perl,DBD :: Oracle和Oracle 10g的字符集問題

我有以下腳本來加載一些測試數據。該腳本保存爲的Latin-1/ISO-8859-1從科莫多IDE遠程UNIX服務器上:

#!/wload/espd/app/perl/bin/perl 

use strict; 
use warnings; 
use Encode; 
use esp_libs_db; 
my $dbh = espDbConnectNew(); 

my $sql = q{ INSERT INTO DBUSER.test VALUES ('qwérty')}; 

#$sql = encode("iso-8859-1", $sql); 

my $rows = $dbh->do($sql) or Carp::croak "ERROR: PM_DB_0010:[" . $DBI::errstr . "] Cannot run stmt:\n";; 
print $rows; 
$dbh->commit(); 
$dbh->disconnect(); 



sub espDbConnectNew { 
    my ($database) = @_;  
    my %connectionStrings = &esp_libs_db::espGetConnectionStrings($database); 

    # Set Environment Variables 
    $ENV{ORACLE_SID}=$connectionStrings{"SID"}; 
    $ENV{ORACLE_HOME}=$connectionStrings{"HOME"}; 
    my $dbh = DBI->connect("dbi:Oracle:SID=$connectionStrings{'SID'};HOST=$connectionStrings{'HOST'};PORT=$connectionStrings{'PID'}", 
    "$connectionStrings{'USER'}","$connectionStrings{'PWD'}", 
    {PrintError=>0, 
    RaiseError => 0, 
    AutoCommit => 0} 
) or Carp::croak "ERROR: PM_DB_0003: Cant connect to db:\n"; 


    return $dbh; 
} #espDbConnect 

它加載到數據庫是Oracle 10g數據庫具有以下參數:

NLS_NCHAR_CHARACTERSET AL16UTF16 
NLS_LANGUAGE ENGLISH 
NLS_TERRITORY UNITED KINGDOM 
NLS_CHARACTERSET WE8ISO8859P1 

測試表上的單列是VARCHAR2(255)類型。

儘管有關這些問題的完整工作日閱讀,我不知道該怎麼做來解決/診斷確切的問題。

我已經試過這兩個有和沒有使用編碼在執行它之前編碼SQL字符串。

感謝

回答

1

你是如何獲取數據時,你得到的倒過來的問號?您要檢索數據的客戶端上的NLS_LANG環境變量是什麼?

在SQL * Plus,可以在運行

SELECT dump(column_name, 1013), column_name 
    FROM DBUSER.test 

和後的結果? DUMP函數顯示實際存儲在數據庫中的內容 - 將顯示問題是存儲重音字符還是問題是檢索重音字符。

+0

我在PLSQL中,我不確定如何知道它使用的是什麼NLS_LANG。 AMERICAN_AMERICA.WE8MSWIN1252是什麼在註冊表中,但我不知道是否有什麼可以覆蓋。如果我運行轉儲,那麼我會得到'Typ = 1 Len = 6 CharacterSet = WE8ISO8859P1:113,119,191,114,116,121 qw'rty'。如果我在UNIX服務器上選擇數據,我會看到同樣的問題。這只是一個小小的測試腳本,用於移除內容類型字符集等因素。 – Nick 2011-04-06 14:43:25

+0

澄清我在使用DBI時未在UNIX客戶端上明確設置NLS_LANG。 – Nick 2011-04-06 14:57:27

+0

我不確定「PL/SQL」中的含義。你的意思是SQL * Plus嗎?根據DUMP的輸出,看起來問題在於存儲字符(ISO 8859-1中的191是倒置問號字符)。在運行腳本之前,您可以將UNIX客戶端上的NLS_LANG設置爲AMERICAN_AMERICA.WE8ISO8859P1嗎? – 2011-04-06 15:05:38