假设我正在查询一个类似于以下内容的表:
$dbh->selectrow_hashref('SELECT id, name FROM foos WHERE name = "bar"');
当然,
id
将是一个整数,但生成的 hashref 将有一个值在内部存储为 Perl PV 而不是 IV。这反过来又会在将数据序列化为 JSON 时产生不良结果。当然也可以手动调用
0+
在值(value)上,但有没有办法拥有DBI
自动将它存储为一个实际的整数,而不仅仅是一个看起来像数字的字符串?还承认 DBIx::Class
和 friend 有解决这个问题的办法,但是DBI
呢?通过它的寂寞?
最佳答案
根据您的数据库驱动程序,您可能*能够在 bind_col
中使用类型提示。 :
use DBI qw(:sql_types);
...
my $sth = $dbh->prepare('SELECT id, name FROM foos WHERE name = "bar"');
$sth->execute;
$sth->bind_col(1, undef, {
TYPE => SQL_INTEGER,
StrictlyTyped => 1,
DiscardString => 1
});
while (my $hr = $sth->fetchrow_hashref) {
say to_json $hr;
}
这试图将第一列(从一个索引)绑定(bind)到
SQL_INTEGER
如果任何值的强制转换失败,则键入并抛出错误。如bohica notes , DiscardString
属性是必要的,因为它“丢弃了数据的字符串部分(pv)”。* 根据 DBI 文档:
Few drivers support specifying a data type via a
bind_col
call (most will simply ignore the data type).
DBD::Oracle
和 DBD::ODBC
支持它,DBD::Pg
可能支持它,根据 this thread (虽然我无法验证),而 DBD::mysql
没有。我不确定其他驱动程序。
关于perl - DBI 在获取行时可以推断或获知数字列类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697073/