gpt4 book ai didi

mysql - 解决 perl DBD::mysql UTF-8 错误

转载 作者:行者123 更新时间:2023-11-29 17:02:26 25 4
gpt4 key购买 nike

我们有一个用 perl 编写的软件,它从 mysql 数据库中检索数据。
为此,我们使用 DBD::mysql 接口(interface)

我们可以正确检索所有数据,db 是 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 的特殊字符进行查询,例如 é ö ä ü 等,我们就不会得到空的结果集。

根据这篇文章,这是由于版本 4.041_01 之前的 dbd::mysql 驱动程序中的错误所致

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 驱动程序可能不会遇到这个错误?

最佳答案

结果是,
该字符串(通过 Net::LDAP::Server 接收)已经采用某种 utf8 编码,然后 mysql 驱动程序确实再次对其进行了编码。

通过添加此代码解决了问题

use Encode qw( decode );
my $decoded = eval { decode('UTF-8', $encoded, Encode::FB_CROAK) }

取自这篇文章的代码: The proper way of encoding detection in perl

感谢您对 mosvy 进行双重编码的提示

关于mysql - 解决 perl DBD::mysql UTF-8 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52168579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com