我们遇到的问题是基本ASCII集之外的字符在我们的Oracle 10g数据库中显示为颠倒的问号。
我有以下脚本来加载一些测试数据。该脚本在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)。
尽管有一整天的工作日阅读这些问题,但我真的不知道如何解决/诊断确切的问题。
我在尝试使用和不使用Encode编码SQL字符串之前尝试了这一点。
由于
答案 0 :(得分:1)
当您获得颠倒的问号时,如何检索数据?您正在检索数据的客户端上的NLS_LANG环境变量是什么?
在SQL * Plus中,您可以运行
SELECT dump( column_name, 1013 ), column_name
FROM DBUSER.test
并发布结果? DUMP函数显示实际存储在数据库中的内容 - 这将显示问题是存储重音字符还是问题在于检索重音字符。