У меня DBIx::Class
исключение:
DBIx::Class::Storage::DBI::_dbh_execute(): DBI Exception: DBD::Pg::st execute failed: ERROR: duplicate key value violates unique constraint "company_name"
DETAIL: Key (name)=(ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ ) already exists. [for Statement "UPDATE "contractor" SET "edr_cert" = ?, "name" = ?, "nds_cert" = ?, "site" = ?, "tax_system" = ? WHERE ( "id" = ? )" with ParamValues: 1='1 071 102 0000 032922', 2='ТÐ.Ð.Ð.Ð Ð.СТÐ.Ð. Ð. Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ю Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ЬÐ.Ð.СТЮ ', 3=undef, 4='info@domain', 5='1', 6='193'] at
Здесь вы можете видеть, что то же значение для столбца name
отображается как:
ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ
ТÐ.Ð.Ð.Ð Ð.СТÐ.Ð. Ð. Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ю Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ЬÐ.Ð.СТЮ
Почему оно отличается? и как это исправить?
Я использую DBD::Pg
и не настраиваю никаких специфических c параметров при подключении к БД, потому что:
DBD :: Pg имеет обширную поддержку для client_encoding в UTF-8, и большинство таких вещей, как кодирование и декодирование, должны выполняться автоматически.
UPD
package HyperMouse::Schema::Result::Contractor;
use utf8;
use Modern::Perl;
use parent 'HyperMouse::Schema::NoTemporalResult';
my $X = __PACKAGE__;
$X->table( 'contractor' );
$X->resultset_class(
'HyperMouse::Schema::ResultSet::Contractor'
);
$X->add_columns(
id => {
data_type => 'integer',
is_auto_increment => 1,
},
name => {
data_type => 'text',
},
);
$X->set_primary_key("id");
$X->add_unique_constraint([ 'name' ]);
где-то в коде:
my $db = DBI::connect( ... );
my $rs = $db->resultset( 'Contractor' );
$rs->create({
name => 'ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ',
});
my $row = $rs->create({ name => 'X2' });
$row->update({
name => 'ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ',
});