通过CPAN Perl DBI:Oracle返回的缺少/错误的字符(缺少变音符号)

环境: Oracle DB 12.2,NLS_LANG:AL32UTF8 安装了Oracleclient 12.2的Linux客户端,还安装了Perl CPAN DBI V:1.636

带有Oracle Client 12.2的Windows 10客户端

实际上,我们测试了一个连接vie DBI:Oracle的新应用程序,并注意到特殊字符(例如ä,ö,ü)丢失/错误返回。

所以我做了一些测试: 在Linux客户端上:

root@test:~# locale
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONetaRY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
root@test:~# export NLS_LANG=GERMAN_GERMANY.AL32UTF8
root@test:~# sqlplus connectstring

SQL*Plus: Release 12.2.0.1.0 Production on Mo Nov 4 14:36:14 2019

Copyright (c) 1982,2016,Oracle.  All rights reserved.

Kennwort eingeben:
Letzte erfolgreiche Anmeldezeit: Mo Nov 04 2019 14:35:53 +01:00

Verbunden mit:
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production

SQL> create table testchar (
  2  ttext varchar2(10));

Tabelle wurde erstellt.

SQL> insert into testchar values ('Ä');

1 Zeile wurde erstellt.

SQL> insert into testchar values ('Ö');

1 Zeile wurde erstellt.

SQL> insert into testchar values ('Ü');

1 Zeile wurde erstellt.

SQL> insert into testchar values ('ß');

1 Zeile wurde erstellt.

SQL> insert into testchar values ('€');

1 Zeile wurde erstellt.

SQL> commit;

Transaktion mit COMMIT abgeschlossen.

SQL> select * from testchar;

TTEXT
----------
Ä
Ö
Ü
ß
€

SQL>

在Windows客户端上:

C:\Users\t>set NLS_LANG=GERMAN_GERMANY.AL32UTF8

C:\Users\t>chcp 65001
Aktive Codepage: 65001.

C:\Users\t>sqlplus connectstring

SQL*Plus: Release 12.2.0.1.0 Production on Mo Nov 4 14:39:43 2019

Copyright (c) 1982,2017,Oracle.  All rights reserved.

Kennwort eingeben:
Letzte erfolgreiche Anmeldezeit: Mo Nov 04 2019 14:37:11 +01:00

Verbunden mit:
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production

SQL> select * from testchar;

TTEXT
----------
Ä
Ö
Ü
ß
€

SQL>

现在在同一Linux客户端上,我编写了一个perl脚本来演示该问题:

root@test:~# cat testumlaut.pl
#!/usr/bin/perl
#use strict;
#use warnings;

use DBI;
$ENV{NLS_LANG} = "GERMAN_GERMANY.AL32UTF8";
my $dbh = DBI->connect( connectstring ) || die($DBI::errstr . "\n");
my $sql = 'select * from testchar';
my $sth = $dbh->prepare($sql);
$sth->execute();
while (my @row = $sth->fetchrow_array) {
        print "Umlaut: $row[0]\n";
}

输出看起来像这样

root@test :~# perl testumlaut.pl
Umlaut: ▒
Umlaut: ▒
Umlaut: ▒
Umlaut: ▒
Wide character in print at testumlaut.pl line 12.
Umlaut: €

这时,Perl DBI模块似乎出现了错误。 有人知道如何解决这个问题吗?

感谢您的帮助。

panpan319 回答:通过CPAN Perl DBI:Oracle返回的缺少/错误的字符(缺少变音符号)

您正在使用utf8编码,因此最简单的解决方法是:

binmode(STDOUT,":utf8");

在打印句子之前。有关此问题的更多详细信息,How can I output UTF-8 from Perl?

本文链接:https://www.f2er.com/3166217.html

大家都在问