Perl: вставка иностранных символов в Oracle - PullRequest
2 голосов
/ 16 января 2020

Мне трудно вставить специальные символы (символы ударения, символы и т. Д. c ..) в мою базу данных oracle. Я могу распечатать данные на экране, но когда я вставляю в базу данных, я просто получаю коробки. Файл с разделителями табуляции по умолчанию имеет кодировку utf-16, и я установил вывод std в utf-8. Я думаю, что мне может понадобиться закодировать его перед вставкой в ​​базу данных, но я не знаю как. Я пробовал разные вещи, но безуспешно. Есть предложения?

Спасибо

use DBI;
use DBD::Oracle;
use open ':std', ':encoding(UTF-8)';

#connection string here
$db = DBI->connect($dataSource, $dbUser, $dbPasswd);
$db ||  die "Error connecting to db: $DBI::errstr\n";


if(open($fh, "<:encoding(UTF-16)", $filename)){
   while (my $row = <$fh>){
                chomp $row;
                my @responses = split (/\t/, $row);
            for(my $i=17; $i<46; $i++){
               my $clob = $responses[$i];
               my $insert = "insert into myTable (id, data) values (?,?)";
               my $insert_detail = $db->prepare($insert) || die "\nPrepare error: $DBI::err .... $DBI::errstr\n";

               $insert_detail->execute('123', $clob);  
            }
   }

}

Ответы [ 2 ]

1 голос
/ 16 января 2020

Это может быть не ответ, но я также столкнулся с подобной проблемой. Вот как я это решил. Осторожно, я читаю весь файл в памяти. Вы можете попробовать подобную вещь и посмотреть, поможет ли это.

use strict;
use warnings;
use Encode qw( encode decode );

my $log_file = "test.log";
open(my $input, "<:raw", $log_file) or die "Can't open $log_file for reading: $!";
my $raw_data = do { local $/; <$input> };

my $decoded_data = eval { decode('UTF-16', $raw_data, Encode::FB_DEFAULT) };
if (!defined $decoded_data) {
    die "Exception occur while decoding log : $@";
}
my @file_data = split("\n", $decoded_data);
0 голосов
/ 16 января 2020

Вам нужно проверить параметры NLS базы данных со следующим

select * from v$parameter where name like 'nls%'

, это также покажет кодировку.

Затем вам нужно либо изменить параметр кодирования в perl Сценарий или настройка переменной среды с именем NLS_LANG для среды, в которой вы запускаете код из

Здесь вы можете проверить, как установить переменную NLS_LANG

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