MySQL注释导致使用Perl DBI搞乱绑定参数计数

fri*_*edo 1 mysql perl comments dbi

我有以下Perl代码进行DBI调用:

my $artsql = q{ *** SNIP A BUNCH OF SQL ***
                where a.article_id != ?
                      and at.type_name != 'List Element'   -- don't get list children
                      and aw.flowstate = 'Published'
                      and a.visible_as_article = 1 }
      . ( $filter ? q{and ch.channel_id = ?
                      and cat.category_id = ? }
                  : '' ) 
         . q{order by a.publish_date desc
                limit 5};

my @bind = ( $article );
push @bind, ( $channel_id, $category_id ) if $filter;

my $articles = $dbh->selectall_arrayref( $artsql, { Slice => { } }, @bind );
Run Code Online (Sandbox Code Playgroud)

$filter是时,该代码与错误死亡:

DBD::mysql::db selectall_arrayref failed: called with 3 bind variables when 1 are needed
Run Code Online (Sandbox Code Playgroud)

起初我认为这是字符串中间的三元条件的问题,(我被多次被这个bug咬了)但是它是正确的.转储一些调试值表明@bind正在构造查询和数组.

然后我注意到查询在第一个绑定变量之后就有一个SQL注释,所以我突然想到了它.噗,它有效!

根据评论的MySQL 文档,

MySQL Server支持三种注释样式:从"#"字符到行尾.从" - "序列到行尾.在MySQL中," - "(双破折号)注释>样式要求第二个破折号后跟至少一个空格或控制字符(例如空格,制表符,换行符等).

由于评论--之后是一个空格,并且(大概)以行尾结束,为什么MySQL会窒息?DBI是否在幕后用换行符或空格做了一些奇怪的事情?

Sch*_*ern 5

您的SQL或Perl代码看起来没有任何问题.

这可能是DBI,DBD :: mysql或MySQL本身的错误.调试此问题的第一步是找出哪个位出错.所以,首先要消除变量.

首先消除绑定变量,硬编码一些值并查看进程是否正确.如果没有那么它可能是DBD :: mysql或DBI中的一个错误.首先尝试更新它们并查看问题是否已修复.如果这不起作用,请报告错误.注意有一个类似的注释解析bug,所以很可能是DBD :: mysql.(你确定do not get list children不是don't get list children吗?)

接下来从等式中消除Perl.在mysql shell中运行查询(使用\ e打开编辑器).它有同样的问题吗?如果是这样,那么MySQL就有错.再次尝试升级.