为什么DBI会将整数隐式更改为字符串?

Aru*_*ngh 3 mysql perl dbi

我有一个具有以下结构的MySQL表.

alid       bigint(20),
ndip       varchar(20),
ndregion   varchar(20),
occ_num    int(3),
Delta_Flag int(1)
Run Code Online (Sandbox Code Playgroud)

从表中选择数据后,我将获取所有引用的数据并作为字符串值.

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;
use FindBin;
use lib $FindBin::Bin;
use Database;

my $pwd = $FindBin::Bin;

my $db  = Database->new( 'mysql', "$pwd/config.ini" );
my $db1 = Database->new( 'mysql', "$pwd/config2.ini" );

my @tables = qw( AutoTT_AlarmStatus_Major1 );

for my $table ( @tables ) {

    my $query_select = "SELECT alid, ndip, ndregion, occ_num, Delta_Flag FROM $table LIMIT 1";
    my $result = $db->db_get_results( $query_select );

    print Dumper( $result );

    for my $item ( @{$result} ) {

        # Here I want to prepare, bind and insert this data
        # into other table with same structure
    }
}
Run Code Online (Sandbox Code Playgroud)

Database.pm

sub db_get_results {
    my $self = shift;
    my $qry  = shift;

    my $sth  = $self->{dbh}->prepare( $qry );
    $sth->execute();

    my @return = ();
    while ( my @line = $sth->fetchrow_array ) {
        push @return, \@line;
    }

    return \@return;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$VAR1 = [
          [
            '1788353',
            '10.34.38.12',
            'North Central',
            '1',
            '1'
          ]
        ];
Run Code Online (Sandbox Code Playgroud)

为什么DBI隐式将所有整数转换为字符串?

Tim*_*nce 7

正如@choroba在他的回答中指出的那样,不是DBI正在对数据做任何事情.它只是通过驱动程序模块(在您的情况下为DBD :: mysql)返回.

在DBI文档的" 通用接口规则和注意事项"部分中,它说:

大多数数据作为字符串返回到Perl脚本.(空值返回为undef.)这允许处理任意精度数值数据而不会损失准确性.请注意,当字符串用作数字时,Perl可能无法保持相同的准确性.

我之前写的那篇文章是在配置perl以支持64位整数的过程中,并且长双浮点类型是不常见的.这些天我建议驱动程序返回最"自然"Perl类型的值,不会有数据丢失的风险.

对于某些可能难以实现的驱动程序,尤其是那些支持从单个句柄返回多个结果集的数据,如DBD :: mysql那样.

我掠过DBD :: mysql的文档,但没有看到这个话题的任何提及,所以我看了一下相关的代码在那里我可以看到,目前DBD :: mysql的返回的数字数字.在更改日志中还有许多对此区域最近更改引用.

也许你正在使用旧版本的DBD :: mysql并且应该升级.