3

在我们的 Oracle 10g 数据库中,基本 ASCII 集之外的字符显示为倒置的问号,我们遇到了问题。

我有以下脚本来加载一些测试数据。该脚本在 Komodo IDE 的远程 UNIX 服务器上保存为 Latin-1/ISO-8859-1:

#!/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 字符串之前,我已经尝试过使用和不使用 Encode 对 SQL 字符串进行编码。

谢谢

4

1 回答 1

1

当你得到颠倒的问号时,你是如何检索数据的?检索数据的客户端上的 NLS_LANG 环境变量是什么?

在 SQL*Plus 中,你能运行

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

并发布结果?DUMP 函数显示数据库中实际存储的内容——这将显示问题是存储重音字符还是问题是检索重音字符。

于 2011-04-06T14:15:45.130 回答