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字符串。
感謝
我在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
澄清我在使用DBI時未在UNIX客戶端上明確設置NLS_LANG。 – Nick 2011-04-06 14:57:27
我不確定「PL/SQL」中的含義。你的意思是SQL * Plus嗎?根據DUMP的輸出,看起來問題在於存儲字符(ISO 8859-1中的191是倒置問號字符)。在運行腳本之前,您可以將UNIX客戶端上的NLS_LANG設置爲AMERICAN_AMERICA.WE8ISO8859P1嗎? – 2011-04-06 15:05:38