Проблемы с набором символов в Perl, DBD :: Oracle и Oracle 10g - PullRequest
3 голосов
/ 06 апреля 2011

У нас есть проблема с символами вне базового набора ASCII, которые отображаются в виде перевернутых вопросительных знаков в нашей базе данных Oracle 10g.

У меня есть следующий скрипт для загрузки некоторых тестовых данных. Сценарий сохраняется как Latin-1 / ISO-8859-1 на удаленном сервере UNIX из Komodo IDE:

#!/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 перед ее выполнением.

Спасибо

1 Ответ

1 голос
/ 06 апреля 2011

Как вы извлекаете данные, когда получаете перевернутые вопросительные знаки?Что такое переменная среды NLS_LANG на клиенте, куда вы извлекаете данные?

В SQL * Plus вы можете запустить

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

и опубликовать результаты?Функция DUMP показывает, что на самом деле хранится в базе данных - это покажет, заключается ли проблема в сохранении символа с акцентом или в том, что проблема заключается в получении символа с акцентом.

...