У меня есть Perl-скрипт, который обновляет поле на SQL Server через DBI.Он читает файл UTF-8, который содержит японские символы.Моя проблема заключается в том, что когда я использую запрос выбора в студии управления SQL-сервером, эти данные являются мусором. Поле уже имеет тип nvarchar , и когда я загружаю его через perl, оно начинается с префикса N (см. Фрагмент кода ниже).Одним интересным поведением является то, что если я выполняю команду в студии управления SQL Server, японские имена не являются мусором, когда я выбираю запрос.Может кто-нибудь объяснить, почему это так?
sub parseFile {
my $sFileNam = shift;
#my $rIN = new FileHandle("< $sFileNam") or die "can't open $sFileNam\n";
open ( my $rIN, '<:encoding(UTF-8)', $sFileNam ) or die "can't open $sFileNam\n";
my $sHeader = <$rIN>;
while(<$rIN>) {
s/[\n\r]*$//;
my ($sKey,$sVal) = split /\t/;
$sVal =~ s/'/''/; #names will have "'" in them so we need to escape it (SQL issue)
my $sFoo = "update dbo.IdTable set Name_Japanese ";
$sFoo .= "= N\'$sVal\' where Qcode = \'$sKey\'";
#update dbo.IdTable set Name_Japanese = N'ベルーナ' where Qcode = '9997'
push @queries, $sFoo;
}
undef $rIN;
}
Приведенный выше код помещает все запросы на обновление в массив, а затем я массово вставляю его через DBI:
my $dbh = DBI->connect("dbi:Sybase:host=$host;port=$port;database=$database;encryptPassword=1", $user, $password);
foreach (@queries) {
my $sth = $dbh->prepare($_);
$sth->execute();
}
пример вывода мусора изполе:
ãã «ã¼ã
Когда я выполняю" update dbo.IdTable set NAMEU = N 'ベ ル ー ナ', где Qcode = '9997' "непосредственно в SQL Server Management Studio, это не мусор:
ベ ル ー ナ