我得到了下面的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 );
当$filter
打开时,此代码将因错误而死亡:
DBD::mysql::db selectall_arrayref failed: called with 3 bind variables when 1 are needed
起初,我认为这是字符串中间三元条件的一个问题(我被那个bug咬了好几次),但这是正确的。转储一些调试值显示查询和@bind
数组的构造是正确的。
然后,我注意到查询在第一个bind变量之后有一个SQL注释,因此我一时兴起就删除了它。嘘,起作用了!
根据MySQL 注释文档的说法
MySQL服务器支持三种注释样式:从“#”字符到行尾。从“--”序列到行尾。在MySQL中,“--”(双破折号)注释>样式要求第二个破折号后面至少有一个空格或控制字符(例如空格、制表符、换行符等)。
既然评论中--
后面有一个空格,并且(大概)以行尾结束,为什么MySQL会窒息呢?DBI在幕后用换行符或空格做一些奇怪的事情吗?
发布于 2010-01-08 13:29:39
您的SQL或Perl代码看起来没有任何问题。
这可能是DBI,DBD::mysql或MySQL本身中的一个bug。调试这个问题的第一步是找出哪个位是错误的。所以,从消除变量开始。
首先消除绑定变量,硬编码一些值,看看进程是否正确。如果不是,那么它可能是DBD::mysql或DBI中的一个bug。首先,尝试更新这两种方法,看看问题是否解决了。如果不管用的话,报告错误。注意,这里有一个类似的注释解析错误,所以很可能是DBD::mysql。(你确定是do not get list children
而不是don't get list children
?)
接下来,从等式中删除Perl。在mysql中运行查询(使用\e打开编辑器)。有同样的问题吗?如果是这样的话,那么MySQL是错误的。再次,尝试升级。
发布于 2010-01-09 12:24:25
我也看到过其他地方也发生过类似的事情。最可能发生的情况是,在各个层中的某个地方(Schwern是正确的,您必须深入了解哪一层),一些代码正在将换行符转换为空格,这在当时看来一定是合法的,所以您的评论占据了整个查询的其余部分。
我建议人们不要在SQL中使用单行注释,除非使用命令行或其他专用客户端。有太多的层涉及到隐藏的bug。
发布于 2010-03-16 12:40:52
评论中的单引号把它搞砸了。不知道是什么导致了这个错误。把“不要得到最后一个孩子”改为“不要得到最后一个孩子”,你的问题就会消失。
https://stackoverflow.com/questions/2030190
复制