1

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

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 );

打开时$filter,此代码因错误而死:

DBD::mysql::db selectall_arrayref failed: called with 3 bind variables when 1 are needed

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

然后我注意到查询在第一个绑定变量之后有一个 SQL 注释,所以我一时兴起将其删除。噗,成功了!

根据 MySQL docs on comments

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

既然注释--后面跟着一个空格并且(大概)以行尾结束,为什么 MySQL 会卡住?DBI 是否在幕后使用换行符或空格做一些奇怪的事情?

4

3 回答 3

5

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

这可能是 DBI、DBD::mysql 或 MySQL 本身中的错误。调试此问题的第一步是找出哪个位有问题。所以,从消除变量开始。

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

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

于 2010-01-08T21:29:39.620 回答
1

我在其他地方也看到过类似的事情。最有可能发生的事情是,在各个层的某个地方(Schwern 是对的,您必须深入研究才能看到哪一层)某些代码正在将换行符转换为空格,这在当时似乎是合理的原因,并且所以你的评论占据了整个查询的其余部分。

我给人们的建议是不要在 SQL 中使用单行注释,除非使用命令行或其他专用客户端。涉及的层太多,并且有隐藏错误的机会。

于 2010-01-09T20:24:25.143 回答
1

评论中的单引号搞砸了。不知道是什么导致了这个错误。将“不要得到最后一个孩子”更改为“不要得到最后一个孩子”,您的问题就会消失。

于 2010-03-16T20:40:52.490 回答