如何正确表示 Perl 的 DBI 中的空格

Posted

技术标签:

【中文标题】如何正确表示 Perl 的 DBI 中的空格【英文标题】:How to represent spaces in Perl's DBI properly 【发布时间】:2013-10-28 16:12:51 【问题描述】:

我在 Informix 表中有一条记录。表格列如下所示:

acct_no integer,
suffix char(1),
meter_num char(20),
date_read datetime year to second not null ,
counter smallint,
reading integer not null ,
typeofread char(1),
estimated char(1),
time_billed datetime year to second

使用 Informix 的 dbaccess 工具:

select * 
from ws_mtrread 
where acct_no = 113091000 
and suffix = " " 
order by date_read desc;

无论我是否使用一个或两个空格作为后缀,都会返回此结果(显示的最新结果)。

acct_no      113091000
suffix
meter_num    34153205
date_read    2013-09-09 23:31:15
counter      0
reading      1240
typeofread   g
estimated
time_billed  2013-10-22 11:48:21

然而,这个 Perl DBI 查询

my $sql_statement = 
"select * ".
"from ws_mtrread ".
"where acct_no = ? ".
"and suffix = ? ".
"order by date_read desc ; ";

不起作用。我可以在不指定 $suffix 的情况下获取该行,因此我知道该行存在。

我认为这是我在表示后缀时的错误。在此示例中,后缀等于由两个空格组成的字符串。

如何正确表示空格,以便查询有效?这是我用来获取行的其余代码。

my $test_acct_no = 113091000;
my $suffix = "  ";

my $pt_sel_hdl = $DBHdl->prepare($sql_statement);

$pt_sel_hdl->execute($test_acct_no, $DBHdl->quote($suffix));

my $ws_mtr_read_rec_ref = $pt_sel_hdl->fetchrow_hashref;

调用后,$ws_mtr_read_rec_ref 未定义。

【问题讨论】:

我会试试的,但这里有个问题。 Informix 接受分号来终止字符串。为什么会有问题? @Barmar 这是 Informix,不是 mysql 我不确定如何表示 errstr()。如果我按照您列出的方式使用,它会出现未定义。 【参考方案1】:

这里不要使用 DBI 的quote 方法:

$pt_sel_hdl->execute($test_acct_no, $DBHdl->quote($suffix));

当您在 SQL 中使用 ? 占位符时,数据库驱动程序将正确参数化您传递给 execute 的查询参数。当您想要搜索 (只有两个空格)时,您可能正在创建一个正在搜索文字字符串 " "(包括引号)的查询。

所以这应该就是你所需要的:

$pt_sel_hdl->execute($test_acct_no, $suffix);

【讨论】:

谢谢。这很有帮助。 正确。 quote() 用于不使用占位符,并且希望将参数直接插入到带有引号的 SQL 语句中。 @runrig 我正在慢慢更改我所有的 $sql_statement 变量以使用占位符。 Informix 4GL 使用嵌入的值或占位符,所以我习惯了两种方法。我通常在 4GL 中使用带有占位符的预处理语句。

以上是关于如何正确表示 Perl 的 DBI 中的空格的主要内容,如果未能解决你的问题,请参考以下文章

Perl 如何使用 DBI 模块更改帐户主机?

Linux中perl-DBI和DBI有啥区别?

Perl 执行 DBI 循环执行

perl 中的 DBD::Oracle 和 DBI 错误

如何使用 Perl 的 DBI 处理 unicode?

Perl DBI / FreeTDS / SQL-Server:如何插入/更新 BLOB varbinary(max) 数据?