perl - DBI 在获取行时可以推断或获知数字列类型吗?

标签 perl dbi

假设我正在查询一个类似于以下内容的表:

$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::OracleDBD::ODBC支持它,DBD::Pg可能支持它,根据 this thread (虽然我无法验证),而 DBD::mysql没有。我不确定其他驱动程序。

关于perl - DBI 在获取行时可以推断或获知数字列类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697073/

相关文章:

ruby-on-rails - 如何从 Rails 中的远程服务器数据库中提取数据?

oracle - 为什么在准备好的语句中使用 COLLECT() 时会得到 "ORA-00932: inconsistent datatypes: expected - got -"?

perl - 从严格的 pragma 中免除一段 perl 代码

arrays - 通过改变数据结构来加速在 Perl 中的数组搜索

sql - Perl DBI 常量 - 如何访问?

mysql - Perl DBI 模块中的操作失败未指示错误

apache - 调试 Apache 2.4 PerlAuthenHandler

perl - 电子表格::WriteExcel - 数据验证

perl - 从其他 cgi 脚本调用 cgi 脚本

linux - 根据第二个文件中对应的 ID 列表从文件中提取第一个条目?