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

最初は、これは文字列の途中にある 3 項条件に問題があると思いました (そのバグに何度も悩まされました) が、それは正しかったです。いくつかのデバッグ値をダンプすると、クエリと@bind配列が正しく構築されていることがわかります。

その後、クエリの最初のバインド変数の直後に SQL コメントがあることに気付き、気まぐれにそれを削除しました。ふふ、うまくいきました!

コメントに関するMySQLのドキュメントによると、

MySQL Server は、「#」文字から行末までの 3 つのコメント スタイルをサポートしています。「--」シーケンスから行末まで。MySQL では、「 -- 」 (二重ダッシュ) コメント > スタイルでは、2 番目のダッシュの後に少なくとも 1 つの空白または制御文字 (スペース、タブ、改行など) が続く必要があります。

コメントの--後にスペースがあり、(おそらく) 行末で終わっていたのに、なぜ 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 シェルでクエリを実行します (\e を使用してエディタを起動します)。同じ問題がありますか?もしそうなら、MySQL に問題があります。もう一度、アップグレードしてみてください。

于 2010-01-08T21:29:39.620 に答える
1

コメント内の一重引用符はそれを台無しにします。このバグの原因がわかりません。「最後の子を取得しない」を「最後の子を取得しない」に変更すると、問題は解決します。

于 2010-03-16T20:40:52.490 に答える
1

他の場所でも同様のことが起こっているのを見たことがあります。おそらく何が起こったのかというと、さまざまなレイヤーのどこかで (Schwern が言うように、どのレイヤーかを調べるには掘り下げる必要があります)、コードの一部が改行をスペースに変換しているということです。あなたのコメントが残りのクエリ全体を占めています。

私が人々に与えるアドバイスは、コマンドラインまたは他の専用クライアントを使用しない限り、SQL で単一行のコメントを使用しないことです。関係するレイヤーが多すぎて、隠れたバグの可能性があります。

于 2010-01-09T20:24:25.143 に答える