sql - DBI 准备好的语句 - 绑定(bind)十六进制通配符字符串

标签 sql arrays perl prepared-statement dbi

我对 Perl 很陌生,而且我被 DBI 的错误难住了。我正在尝试查询由其十六进制值定义的一系列字符:

my @compare = ( '\'%\'+x\'0A\'+\'%\'',
                '\'%\'+x\'92\'+\'%\'',
                '\'%\'+x\'96\'+\'%\'',
                '\'%\'+x\'A0\'+\'%\'' );

my $fetch_bad_rows = $dbh->prepare( qq{
    SELECT B.* FROM ... AS B
    WHERE B. ... LIKE ?
        OR B. ... LIKE ?
        OR B. ... LIKE ?
        OR B. ... LIKE ?
});

$fetch_bad_rows->execute(@compare)

my $counter;
for( $counter = 0; $fetch_bad_rows->fetch; $counter++ ) {};
print LOG sprintf("Found %d bad rows\n", $counter);

以这种方式执行语句会找到 0 行。但是,如果我对查询中的字符串进行硬编码,则会得到 437 条记录:
my $fetch_bad_rows = $dbh->prepare( qq{
SELECT B.* FROM ... AS B
    WHERE B. ... LIKE '%'+x'0A'+'%'
        OR B. ... LIKE '%'+x'92'+'%'
        OR B. ... LIKE '%'+x'96'+'%'
        OR B. ... LIKE '%'+x'A0'+'%'
});

$fetch_bad_rows->execute

我无法弄清楚我在传递绑定(bind)值时做错了什么。

有人有想法么?提前致谢。

最佳答案

?prepare将确保一切都逃脱。所以如果你传入的东西有 '它会转义引号:

'\'%\'+x\'0A\'+\'%\''

可以更容易地写成:
q{'%'+x'0A'+'%'}

将变成:
... LIKE '\'%\'+x\'0A\'+\'%\''

因此它什么也找不到。

关于sql - DBI 准备好的语句 - 绑定(bind)十六进制通配符字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22302709/

相关文章:

database - 违反了第一范式,可以满足我的目的吗?

python - 如何将具有行数组的 Dataframe 转换为 numpy 矩阵?

perl - 在 Perl 中使用 TLS 的 POP3 - 帮助启动 starttls 工作?

php - CakePHP - 对 JOIN 的结果进行分组和重复数据删除

mysql - 同一 mysql 查询中的左连接和内连接不起作用

mysql - 如何将多个 MySQL 行连接到一个字段中?

perl - 防止Perl打印相同的警告消息

mysql - Int 值在数据库中存储为空字符串,尝试将新值设置为旧值会产生 "cannot convert string to int"问题

javascript - 访问对象内部的数组

perl - perl 中未提供文件名时如何使用 __DATA__ 句柄