Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl DBD::MySQL execute不支持limit关键字后的字符串参数。总是被当作数字_Mysql_Perl_Limit_Quotes_Sanitization - Fatal编程技术网

Perl DBD::MySQL execute不支持limit关键字后的字符串参数。总是被当作数字

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

我们最近用最新的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中设置“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中添加一些括号。

我尝试了使用括号,但它无法像派生表那样解决问题。我尝试了使用括号,但无法像派生表那样解决问题。