Японские символы выглядят мусором в студии SQL Server Management (2012) - PullRequest
0 голосов
/ 31 мая 2018

У меня есть 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, это не мусор:

ベ ル ー ナ

...