DBD :: Oracle и utf8 - PullRequest
       42

DBD :: Oracle и utf8

1 голос
/ 09 апреля 2010

У меня есть некоторые проблемы при вставке строки UTF8 в базу данных oracle 10 в Solaris с использованием последней версии DBD :: Oracle на perl v5.8.4.

Это мои настройки БД

> --------SELECT * from NLS_DATABASE_PARAMETERS-------------------------------
> NLS_NCHAR_CHARACTERSET AL16UTF16
> NLS_LANGUAGE AMERICAN
> NLS_TERRITORY AMERICA NLS_CURRENCY $
> NLS_ISO_CURRENCY AMERICA
> NLS_NUMERIC_CHARACTERS .,
> NLS_CHARACTERSET UTF8
> NLS_CALENDAR GREGORIAN
> NLS_DATE_FORMAT DD-MON-RR
> NLS_DATE_LANGUAGE AMERICAN
> NLS_SORT BINARY
> NLS_TIME_FORMAT HH.MI.SSXFF AM
> NLS_TIMESTAMP_FORMAT DD-MON-RR
> HH.MI.SSXFF AM
> NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
> NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR
> HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY $
> NLS_COMP BINARY
> NLS_LENGTH_SEMANTICS CHAR
> NLS_NCHAR_CONV_EXCP FALSE
> NLS_RDBMS_VERSION 10.2.0.4.0
> --------------------------------------------------------------------------

Это мой perl $ dbh-> ora_nls_parameters ()

$VAR1 = {
          'NLS_LANGUAGE' => 'AMERICAN',
          'NLS_TIME_TZ_FORMAT' => 'HH.MI.SSXFF AM TZR',
          'NLS_SORT' => 'BINARY',
          'NLS_NUMERIC_CHARACTERS' => '.,',
          'NLS_TIME_FORMAT' => 'HH.MI.SSXFF AM',
          'NLS_ISO_CURRENCY' => 'AMERICA',
          'NLS_COMP' => 'BINARY',
          'NLS_CALENDAR' => 'GREGORIAN',
          'NLS_DATE_FORMAT' => 'DD-MON-RR',
          'NLS_DATE_LANGUAGE' => 'AMERICAN',
          'NLS_TIMESTAMP_FORMAT' => 'DD-MON-RR HH.MI.SSXFF AM',
          'NLS_TERRITORY' => 'AMERICA',
          'NLS_LENGTH_SEMANTICS' => 'CHAR',
          'NLS_NCHAR_CHARACTERSET' => 'AL16UTF16',
          'NLS_DUAL_CURRENCY' => '$',
          'NLS_TIMESTAMP_TZ_FORMAT' => 'DD-MON-RR HH.MI.SSXFF AM TZR',
          'NLS_NCHAR_CONV_EXCP' => 'FALSE',
          'NLS_CHARACTERSET' => 'UTF8',
          'NLS_CURRENCY' => '$'
        };

В моем сценарии у меня есть:

use utf-8;
$ENV{NLS_LANG}='AMERICAN_AMERICA.UTF8';
..
$sth->bind_param(5, $myclobfield, {ora_type => ORA_CLOB, ora_csform => SQLCS_NCHAR});
..

Строка выводит 1 на

print Encode::is_utf8($myclobfield);

Но такие символы, как символы, неправильно вставлены в БД. (Я тестировал с utf8-совместимым клиентом, который может правильно вставить и прочитать их)

Может кто-нибудь предложить лучший способ сделать это? Спасибо

Ответы [ 2 ]

1 голос
/ 09 апреля 2010

Хорошо, после нескольких часов стука и взлома всех администраторов баз данных, которые я мог, я решил:

Мне не хватало этого:

 $ENV{NLS_NCHAR}='AL32UTF16';

также будьте осторожны с

utf8::encode($myclobfield);

если вы не уверены, что это UTF8

Приветствие G.

0 голосов
/ 01 июля 2011

Литералы Unicode должны начинаться с префикса 'n', например:

выберите n'Language - Språk - Język 'из двойного;

Кроме того, проверьте следующее: Вставка национальных символов в столбец NCHAR или NVARCHAR оракула не работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...