首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >导致Perl DBI绑定参数计数混乱的MySQL注释

导致Perl DBI绑定参数计数混乱的MySQL注释
EN

Stack Overflow用户
提问于 2010-01-08 19:37:12
回答 3查看 987关注 0票数 1

我得到了下面的Perl代码,它生成DBI调用:

代码语言:javascript
代码运行次数:0
运行
复制
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打开时,此代码将因错误而死亡:

代码语言:javascript
代码运行次数:0
运行
复制
DBD::mysql::db selectall_arrayref failed: called with 3 bind variables when 1 are needed

起初,我认为这是字符串中间三元条件的一个问题(我被那个bug咬了好几次),但这是正确的。转储一些调试值显示查询和@bind数组的构造是正确的。

然后,我注意到查询在第一个bind变量之后有一个SQL注释,因此我一时兴起就删除了它。嘘,起作用了!

根据MySQL 注释文档的说法

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

既然评论中--后面有一个空格,并且(大概)以行尾结束,为什么MySQL会窒息呢?DBI在幕后用换行符或空格做一些奇怪的事情吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-08 21: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是错误的。再次,尝试升级。

票数 5
EN

Stack Overflow用户

发布于 2010-01-09 20:24:25

我也看到过其他地方也发生过类似的事情。最可能发生的情况是,在各个层中的某个地方(Schwern是正确的,您必须深入了解哪一层),一些代码正在将换行符转换为空格,这在当时看来一定是合法的,所以您的评论占据了整个查询的其余部分。

我建议人们不要在SQL中使用单行注释,除非使用命令行或其他专用客户端。有太多的层涉及到隐藏的bug。

票数 1
EN

Stack Overflow用户

发布于 2010-03-16 20:40:52

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2030190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档