gpt4 book ai didi

mysql - Perl DBI::fetchrow_array() 为 NULL 给出空而不是 undef

转载 作者:可可西里 更新时间:2023-11-01 07:32:16 27 4
gpt4 key购买 nike

迁移到新服务器后,在执行 SELECT 查询时,如果请求的列值为 NULL,Perl 的 DBI::fetchrow_array() 返回看似空字符串:defined() 返回 1,length() 返回 0。

我读到的所有内容都告诉我,我应该从 NULL 中获取 undef,这确实是它在我的旧服务器上的工作方式。新服务器有一个 MySQL 数据库的副本,我使用 Sequel ProExport SQLImport SQL 功能迁移了它,这是一个 MySQL gui我在我的 Mac 上运行。对于这两个数据库,有问题的值在 Sequel Pro 中清楚地显示为灰色 NULL,如果我以交互方式运行 mysql,则显示为 NULL。例如,查看此抄本中的 name:

mysql> SELECT * from trials WHERE id = 26069 ;
+-------+----------+-----------+---------+--------+ ...
| id | language | numTrials | name | status | ...
+-------+----------+-----------+---------+--------+ ...
| 26069 | en | 3 | NULL | Done | ...
+-------+----------+-----------+---------+--------+ ...
1 row in set (0.00 sec)

我的旧服务器运行的是旧包:

  • Perl 5.10.1 与 5.22.1
  • DBI 1.634 与 1.636
  • DBD::mysql 4.022 与 4.033

这是我围绕 fetchrow_array 编写的代码:

@result = $statementHandle->fetchrow_array ;

for my $value (@result) {
if (! utf8::is_utf8($value)) {
utf8::decode($value) ;

# Log values for debugging the NULL/undef issue:
my $aValue = $value ;
my $len = length($aValue) ;
if (!defined($value)) {
$aValue = "<unnndefined>" ;
}
print {*::STDLOG} info => "daValue l=$len : $daValue\n" ;
}
}

非常感谢任何可以建议这里可能发生的事情的人!

最佳答案

您的代码将产生警告

Use of uninitialized value in subroutine entry

您调用 utf8::decode($value)尝试转换 $value到一个字符串。如果你通过了undef然后该值将被视为空字符串(带有伴随的警告)并解码并存储

将所有这些代码包含在您的条件语句中似乎很奇怪。当然你只是想要

utf8::decode($value) if $value and not utf8::is_utf8($value);

然后其余代码应该独立于字段的编码状态?

更好的是,你应该确保 DBI通过添加选项 {mysql_enable_utf8mb4 => 1},自动对进出数据库的字符串进行编码和解码。到数据库 connect称呼。您还需要添加 CHARACTER SET utf8mb4CREATE TABLECREATE DATABASE声明。 (不要使用 CHARACTER SET utf8 ;它是真实 UTF-8 的子集,每个字符限制为三个字节。)当然,您可以 ALTER TABLE如果需要,在初始创建之后。

关于mysql - Perl DBI::fetchrow_array() 为 NULL 给出空而不是 undef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39807181/

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