我有一个具有以下结构的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)
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隐式将所有整数转换为字符串?
正如@choroba在他的回答中指出的那样,不是DBI正在对数据做任何事情.它只是通过驱动程序模块(在您的情况下为DBD :: mysql)返回.
在DBI文档的" 通用接口规则和注意事项"部分中,它说:
大多数数据作为字符串返回到Perl脚本.(空值返回为undef.)这允许处理任意精度数值数据而不会损失准确性.请注意,当字符串用作数字时,Perl可能无法保持相同的准确性.
我之前写的那篇文章是在配置perl以支持64位整数的过程中,并且长双浮点类型是不常见的.这些天我建议驱动程序返回最"自然"Perl类型的值,不会有数据丢失的风险.
对于某些可能难以实现的驱动程序,尤其是那些支持从单个句柄返回多个结果集的数据,如DBD :: mysql那样.
我掠过DBD :: mysql的文档,但没有看到这个话题的任何提及,所以我看了一下相关的代码在那里我可以看到,目前DBD :: mysql的被返回的数字数字.在更改日志中还有许多对此区域最近更改的引用.
也许你正在使用旧版本的DBD :: mysql并且应该升级.