2011-04-06 73 views
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字符串。

感谢

回答

1

你是如何获取数据时,你得到的倒过来的问号?您要检索数据的客户端上的NLS_LANG环境变量是什么?

在SQL * Plus,可以在运行

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

和后的结果? DUMP函数显示实际存储在数据库中的内容 - 将显示问题是存储重音字符还是问题是检索重音字符。

+0

我在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

+0

澄清我在使用DBI时未在UNIX客户端上明确设置NLS_LANG。 – Nick 2011-04-06 14:57:27

+0

我不确定“PL/SQL”中的含义。你的意思是SQL * Plus吗?根据DUMP的输出,看起来问题在于存储字符(ISO 8859-1中的191是倒置问号字符)。在运行脚本之前,您可以将UNIX客户端上的NLS_LANG设置为AMERICAN_AMERICA.WE8ISO8859P1吗? – 2011-04-06 15:05:38