2011-04-06 5 views
2

Oracle 10g 데이터베이스에서 기본 ASCII 집합 이외의 문자가 거꾸로 물음표로 나타나는 문제가 있습니다.Perl, DBD :: Oracle 및 Oracle 10g 문자 집합 문제

일부 테스트 데이터를로드하기 위해 다음 스크립트가 있습니다. 이 스크립트는 코모도 IDE에서 원격 UNIX 서버에 라틴어-1/ISO-8859-1로 저장됩니다

NLS_NCHAR_CHARACTERSET AL16UTF16 
NLS_LANGUAGE ENGLISH 
NLS_TERRITORY UNITED KINGDOM 
NLS_CHARACTERSET WE8ISO8859P1 
:

#!/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 데이터베이스입니다

테스트 테이블의 단일 열은 VARCHAR2 (255) 유형입니다.

이러한 문제에 대한 완전한 평일의 독서에도 불구하고 나는 정확한 문제를 풀거나 진단하기 위해 무엇을해야할지 잘 모른다.

저는 이것을 실행하기 전에 SQL 문자열을 인코딩하기 위해 Encode를 사용하거나 사용하지 않고이 방법을 시도했습니다. 당신이 거꾸로 물음표를 얻을 때

감사

답변

1

당신은 어떻게 데이터를 검색하는? 데이터를 검색하는 클라이언트의 NLS_LANG 환경 변수는 무엇입니까?

SQL * 플러스에서

, 당신은

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 서버에서 데이터를 선택하면 동일한 문제가 발생합니다. 이것은 content-type charsets와 같은 요소를 제거하는 간단한 테스트 스크립트 일뿐입니다. – Nick

+0

명확히하기 위해 DBI를 사용할 때 UNIX 클라이언트에서 명시 적으로 NLS_LANG를 설정하지 않습니다. – Nick

+0

PL/SQL에서 무엇을 의미하는지 모르겠습니다. SQL * Plus를 의미합니까? DUMP의 결과에 따라 문제는 문자를 저장하는 것입니다 (ISO 8859-1의 191은 물음표가 거꾸로 됨). 스크립트를 실행하기 전에 UNIX 클라이언트의 NLS_LANG를 AMERICAN_AMERICA.WE8ISO8859P1로 설정할 수 있습니까? –