ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql – Perl DBI :: fetchrow_array()为NULL提供空而不是undef

2019-06-23 05:02:03  阅读:399  来源: 互联网

标签:mysql perl dbi


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

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

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 vs. 5.22.1
> DBI 1.634 vs. 1.636
> DBD :: mysql 4.022 vs. 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}到数据库连接调用.您还需要将CHARACTER SET utf8mb4添加到CREATE TABLE或CREATE DATABASE语句中. (不要使用CHARACTER SET utf8;这是真实UTF-8的一个子集,每个字符限制为三个字节.)当然,如果需要,可以在初始创建后使用ALTER TABLE.

标签:mysql,perl,dbi
来源: https://codeday.me/bug/20190623/1267428.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有