简体   繁体   English

DBD :: Oracle和utf8

[英]DBD::Oracle and utf8

I have some troubles inserting an UTF8 string into an oracle 10 database on Solaris, using the latest DBD::Oracle on perl v5.8.4. 我在perl v5.8.4上使用最新的DBD :: Oracle将UTF8字符串插入Solaris上的oracle 10数据库时遇到了一些麻烦。

This are my DB settings 这是我的数据库设置

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

This are my perl $dbh->ora_nls_parameters() 这是我的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' => '$'
        };

In my script I have: 在我的脚本中,我有:

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

The string prints out 1 on 字符串在输出1

print Encode::is_utf8($myclobfield);

But characters like òàè are not correctly inserted into the DB. 但是诸如ààè之类的字符未正确插入数据库中。 (I tested with a utf8 compliant client that can correctly insert and read them) (我已测试了可正确插入和读取utf8的客户端)

Can anyone suggest the best way to do it? 谁能建议最好的方法吗? Thanks 谢谢

Ok after couple of hours of hammering, and tampering all the DBAs I could, I Solved it: 在经过数小时的锤击和篡改所有DBA之后,我解决了:

I was missing this: 我错过了这个:

 $ENV{NLS_NCHAR}='AL32UTF16';

also be careful to 也要小心

utf8::encode($myclobfield);

if you're not sure it's UTF8 如果您不确定它是UTF8

Cheers G. 干杯G.

Unicode literals needs to be prefixed with an 'n', like this: Unicode文字需要以'n'为前缀,如下所示:

select n'Language - Språk - Język' from dual; 从双中选择n'Language-Språk-Język';

Also, check this: Inserting national characters into an oracle NCHAR or NVARCHAR column does not work 另外,请检查以下内容: 在oracle NCHAR或NVARCHAR列中插入国家字符不起作用

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM