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