迁移到新服务器后,在执行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
我的旧服务器正在运行较旧的软件包:
以下是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
非常感谢任何能够提出可能会发生什么的人!
答案 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 TABLE
或CREATE DATABASE
语句中。 (不要使用CHARACTER SET utf8
;这是真正的UTF-8的子集,每个字符限制为三个字节。)当然,如果需要,您可以在初始创建后ALTER TABLE
。