Проблема кодирования при записи в базу данных (Perl) - PullRequest
0 голосов
/ 03 мая 2018

В Perl v5.10.1 я пытаюсь прочитать файл и сохранить строки в базе данных. Проблемы возникают, когда строки содержат акценты и экзотические символы.

В моем CentOS 6 команда locale указывает: LANG = en_US.UTF-8

Моя БД - MySQL , поле, на котором я пишу, - varchar (64) utf8_unicode_ci .

Я запускаю свой тест через консоль Putty, выбрав «Окно»> «Перевод»> «Удаленный набор символов»: UTF8, хотя напечатанные символы искажены, но это не главная проблема.

Вот мой сценарий:

#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use open ':std', ':encoding(UTF-8)';
use DBI;

# A test string
my $test = 'é';
print "- 1: $test\n";

# First string in my file, containing a single 'é'
my $string = '';
open(my $fh, '<', 'myFile');
while(my $line = <$fh>) {
  chomp $line;
  $string = $line;
  last;
}
close $fh;
print "- 2: $string\n";


# Writing test string and first string in DB
my $dbistring = 'DBI:mysql:database=xxxx;host=xxxx;port=xxxx';
my $socket = DBI->connect($dbistring, 'xxxx', 'xxxx');
my $cmd = 'UPDATE Strings SET string="'.$test.'" WHERE id=1';
my $request = $socket->prepare($cmd);
$request->execute();
$cmd = 'UPDATE Strings SET string="'.$string.'" WHERE id=2';
$request = $socket->prepare($cmd);
$request->execute();

Отпечатки следующие:

  • 1: ▒

  • 2: ▒

В моей таблице БД поля заканчиваются как:

  • id 1: © 1036 *

  • id 2: © 1040 *

Чтобы избежать возможного двойного кодирования при конкатенации строк Perl, я попытался:

$string = Encode::decode('UTF-8', $string);

дает мне тот же результат. То же самое, если при открытии файла указать «<: encoding (UTF-8)». </p>

Я очень запутался, поскольку моя цепочка процессов, кажется, полностью настроена в UTF8. Предложения с благодарностью.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Некоторые проблемы в Perl

use utf8;
use open ':std', ':encoding(UTF-8)';

my $dbh = DBI->connect("dbi:mysql:".$dsn, $user, $password, {
       PrintError => 0,
       RaiseError => 1,
       mysql_enable_utf8 => 1,  # Switch to UTF-8 for communication and decode.
});
# or {mysql_enable_utf8mb4 => 1} if using utf8mb4

кракозябры

См. «Моджибаке» в Проблема с символами UTF-8; я вижу не то, что я сохранил , чтобы проверить другие проблемы.

0 голосов
/ 03 мая 2018

Это ценная статья предоставлено решение:

Проблема возникает во время связи между DBI и БД и решается путем добавления флага mysql_enable_utf8 во время соединения:

DBI->connect($dbistring, 'xxxx', 'xxxx', { mysql_enable_utf8 => 1 });
...