对于NULL,Perl DBI :: fetchrow_array()为空而不是undef

时间:2016-10-01 13:25:17

标签: mysql perl dbi

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

我读到的所有内容都告诉我,我应该从 NULL 中获取 undef ,这确实是它在旧服务器上运行的方式。新服务器有一个MySQL数据库的副本,我使用 Secho Pro 导出SQL 导入SQL 功能进行迁移,这是一个MySQL gui。我在我的Mac上运行。对于这两个数据库,有问题的值在Sequel Pro中清晰地显示为灰色 NULL ,如果我以交互方式运行length(),则显示为NULL。例如,请参阅此成绩单中的mysql

name

我的旧服务器正在运行较旧的软件包:

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

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

fetchrow_array

非常感谢任何能够提出可能会发生什么的人!

1 个答案:

答案 0 :(得分:4)

您的代码将产生警告

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 utf8mb4添加到CREATE TABLECREATE DATABASE语句中。 (不要使用CHARACTER SET utf8;这是真正的UTF-8的子集,每个字符限制为三个字节。)当然,如果需要,您可以在初始创建后ALTER TABLE