Perl DBD::MySQL execute不支持limit关键字后的字符串参数。总是被当作数字
我们最近用最新的DBI MySQL、Perl等建立了一个新的操作系统 在我们的几个应用程序中发现了这种模式,当安装到新的操作系统上时,这种模式正在被打破Perl DBD::MySQL execute不支持limit关键字后的字符串参数。总是被当作数字,mysql,perl,limit,quotes,sanitization,Mysql,Perl,Limit,Quotes,Sanitization,我们最近用最新的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 t
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中设置“555”现在会在MySQL中产生“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的命令是错误的。尝试一下,希望它已经解决了这个问题。解析包含LIMIT的命令是错误的。尝试一下,希望已经解决了这个问题。您的更新操作系统是否包含较新版本的MySQL?报告说: 若要对单个SELECT应用ORDER BY或LIMIT,请将子句放在包含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子句对整个联合结果进行排序或限制,请将各个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中添加一些括号。您更新的操作系统是否包含较新版本的MySQL?报告说: 若要对单个SELECT应用ORDER BY或LIMIT,请将子句放在包含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子句对整个联合结果进行排序或限制,请将各个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中添加一些括号。我尝试了使用括号,但它无法像派生表那样解决问题。我尝试了使用括号,但无法像派生表那样解决问题。