我们的Oracle 10g数据库中出现了基本ASCII字符集之外的字符,这些字符会以倒置的问号形式出现。
我有以下脚本用于加载一些测试数据。该脚本在Komodo IDE上保存为Latin-1/ISO-8859-1格式,并存储在远程UNIX服务器上:
它所加载的数据库是一个Oracle 10g数据库,具有以下参数:
我有以下脚本用于加载一些测试数据。该脚本在Komodo IDE上保存为Latin-1/ISO-8859-1格式,并存储在远程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)。
尽管我整天都在阅读这些问题,但我真的不知道该怎么做才能解决/诊断出确切的问题。
我已经尝试过使用Encode对SQL字符串进行编码和不进行编码来执行它。
谢谢
Typ=1 Len=6 CharacterSet=WE8ISO8859P1: 113,119,191,114,116,121 qw¿rty
。如果我在UNIX服务器上选择数据,则会遇到相同的问题。这只是一个小测试脚本,以消除像内容类型字符集这样的因素。 - Nick$ENV{NLS_LANG} = 'AMERICAN_AMERICA.WE8ISO8859P1';
。然后,当我尝试连接到数据库时出现错误。不幸的是,$DBI::errstr只是说它在检索错误文本时遇到问题。我设置NLS_LANG有问题吗? - Nick