Среда: Oracle DB 12.2, NLS_LANG: AL32UTF8 Клиент Linux с установленным OracleClient 12.2, также установлен Perl CPAN DBI V: 1.636
Клиент Windows 10 с клиентом Oracle 12.2
На самом деле мы тестируемНовое приложение, которое подключается через 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. Кто-нибудь знает, как решить эту проблему?
спасибо за вашу помощь.