Perl DBD::MySQL execute 不支持 limit 关键字后的字符串参数。始终被视为数字

Perl DBD::MySQL execute doesn't support string parameter after limit keyword. Always treated as number

提问人:700 Software 提问时间:2/8/2019 最后编辑:700 Software 更新时间:2/8/2019 访问量:90

问:

我们最近建立了一个新的操作系统,其中包含最新的 DBI、MySQL、Perl 等。

这种模式在我们的几个应用程序中被发现,并且在安装在新操作系统上时被破坏。

my $sth = $dbh->prepare('select null colname, null colname2 limit 0'
        . ' union all select x, y from tbl where col like ?'
        . ' union all select z, a from tbl2 where col like ?');
$sth->execute('%test%', '%test%') or die ...;

该错误是 MySQL 语法错误。 我们已经确定了参数引用方式的问题。

在上面的示例中,它在 MySQL 中像这样解析。

select null colname, null colname2 limit 0
union all select x, y from tbl where col like 
union all select z, a from tbl2 where col like 

但是,如果用数字(例如)交换,它就会通过。'%test%''555'

select null colname, null colname2 limit 0
union all select x, y from tbl where col like 555
union all select z, a from tbl2 where col like 555

请注意没有引号。

我们已确定这与关键字的存在有关。删除关键字可解决语法错误。limit

select null colname, null colname2
union all select x, y from tbl where col like '%test%'
union all select z, a from tbl2 where col like '%test%'

此外,在 Perl 中设置现在会导致 MySQL,并带有引号。'555''555'

我们发现,使用派生表是目前最快的解决方法,

select * from (select null colname, null colname2 limit 0)a
union all select x, y from tbl where col like '%test%'
union all select z, a from tbl2 where col like '%test%'

(只尝试了括号,但需要派生表才能工作)但我很好奇是否有办法通过DBI / DBD::MySQL接口来控制报价方法。(避免对声明进行更新)

是更改默认行为以禁用关键字逻辑
,还是强制将特定参数类型作为字符串?
limit

MySQL Perl 限制 报价清理

评论


答:

5赞 choroba 2/8/2019 #1

解析包含 LIMIT 的命令有问题。尝试DBD::MariaDB来代替,希望它已经解决了这个问题(这里)。

0赞 Dave Cross 2/8/2019 #2

更新后的操作系统是否包含较新版本的 MySQL?MySQL中UNION的文档是这样说的:

要将 ORDER BY 或 LIMIT 应用于单个 SELECT,请将子句放在 SELECT 括起来的括号内:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

还有这个:

要使用 ORDER BY 或 LIMIT 子句对整个 UNION 结果进行排序或限制,请将各个 SELECT 语句括起来,并将 ORDER BY 或 LIMIT 放在最后一个语句之后。以下示例同时使用这两个子句:

(SELECT a FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;

所以我认为你需要在SQL中添加一些括号。

评论

0赞 700 Software 2/11/2019
我只尝试了括号,但不知何故,它没有像派生表那样解决问题。