DBD::Pg дважды кодирует символы UTF8 при вставке данных

Я пытаюсь вставить строки UTF8 в PostgreSQL, используя DBD:: Pg, и всегда получаю UTF8 с двойным кодированием в базе данных. Я получаю правильные символы в БД только если строки, которые я вставляю, являются Latin1.

Как я могу сказать DBD:: Pg не перекодировать мои строки, которые уже являются UTF8?

Тестовый скрипт:

!/usr/bin/perl

use strict;

my $PGDB      = 'dbi:Pg:dbname=test;host=localhost';
my $PGDB_USER = 'username';    
my $SQL_INSERT = 'INSERT INTO tmp1 (t1, t2) VALUES (?, ?)';

use DBI;

my $dbh = DBI->connect($PGDB, $PGDB_USER)
    || die "Couldn't connect to $PGDB as user $PGDB_USER: $DBI::errstr\n";

#$dbh->do("SET client_encoding TO UTF8");

my $sth = $dbh->prepare( $SQL_INSERT )
    || die "Can't prepare insert statement $SQL_INSERT: $DBI::errstr";

my $cp1252 = "\xe9 voil\xe0";
my $utf8   = "é voilà";

utf8::upgrade($utf8);

use utf8;
#use bytes;

my $text = 'sent utf8 w. utf8::upgrade';

$sth->execute($utf8, $text) or die $sth->errstr, "\n";

Полученная таблица после нескольких тестов:

é voilà     sent cp1252 as_is w. use bytes
é voilà   sent utf8 as_is w. use bytes
é voilà   sent utf8 as_is w. use utf8
é voilà     sent cp1252 as_is w. use utf8
é voilà     sent cp1252 as_is w. do(SET client_encoding TO UTF8)
é voilà   sent utf8 as_is w. do(SET client_encoding TO UTF8)
é voilà   sent utf8 as_is w. use utf8 + do(SET client_encoding TO UTF8)
é voilà   sent utf8 w. utf8::upgrade + do(SET client_encoding TO UTF8)
é voilà   sent utf8 w. utf8::upgrade

(Это на Ubuntu 16.04 с версией 3.5.3 DBD:: Pg. У меня не было этой проблемы с версией DBD:: Pg, установленной на Ubuntu 12.04)

0 ответов

Другие вопросы по тегам