У нас есть программа, написанная на Perl, которая извлекает данные из базы данных mysql. Для этого мы используем интерфейс DBD::mysql.
Мы можем правильно получить все данные, база данных — UTF8MB4, а приложение perl использует UTF-8.
Код для получения результата sql:
use utf8;
use encoding 'utf8';
...
my $dsn = "DBI:mysql:database=mydatabase;mysql_enable_utf8=1";
my $dbh = DBI->connect($dsn, $userid, $password, { mysql_enable_utf8 => 1 } ) or die $DBI::errstr;
...
my $sth = $dbh->prepare("SELECT addressid,
company, firstname, lastname,
address, zip, city, country,
phone, mobile, home,
speeddial_phone, speeddial_mobile, speeddial_home,
fax, email
FROM address
WHERE (firstname like ? or lastname like ? or company like ?)
LIMIT $sizeLimit
");
$sth->execute( $searchExpression, $searchExpression, $searchExpression) or die $DBI::errstr;
Пока выражение $searchExpression содержит обычные символы, оно работает нормально. Но как только мы запрашиваем специальные символы не в ASCII, например é ö ä ü и подобные, мы не получаем обратно пустой набор результатов.
Согласно этому сообщению, это связано с ошибкой в драйверах dbd::mysql до версии 4.041_01.
http://blogs.perl.org/users/mike_b/2016/12/dbdmysql-all-your-utf-8-bugs-are-belong-to-us.html
Я пробовал разные вещи, но безрезультатно.
Я включил ведение журнала запросов на сервере mysql, и там я вижу, что параметры со специальными символами поступают в неправильной кодировке.
Здесь вывод журнала mysql в файл:
Time Id Command Argument
180905 9:17:06 403 Connect inno-ldap-db@localhost on phonebook_innovaphone
403 Query SELECT addressid,
company, firstname, lastname,
address, zip, city, country,
phone, mobile, home,
speeddial_phone, speeddial_mobile, speeddial_home,
fax, email
FROM address
WHERE companyid='1' and (firstname like 'andré%' or lastname like 'andré%' or company like 'andré%' )
LIMIT 25
403 Quit
Поскольку в настоящее время мы не можем обновить систему (это Debian 7, который включает только более старые пакеты, такие как 4.021-1+deb7u3), мне нужно было бы решить эту проблему.
Либо какое-то волшебство для предварительного кодирования/декодирования параметров, либо драйвер odbc, возможно, не столкнется с этой ошибкой?