PR

【SQL】エラー “SQLSTATE[42S22]: Column not found:” がでるケース

プログラミング

久しぶりに発生するとムダに悩むケースです。
ちょっとエラー・メッセージがトリッキーになってしまう場合なので。

スポンサーリンク

状況

実行したSQL文はこんな感じですが(PHP使ってます)

SELECT * FROM table_a WHERE column_a = $input_data;

このSQL文はうまくいく時と、エラーになる時があります。

そのエラーで出るメッセージが、↓これ。

     

SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘ABC001’ in ‘where clause’ ~~以下略

 

このメッセージを素直に読むと「WHERE句のカラムが見つからない」

普通なら、そんなバカな?とSQL文のWHERE句をにらみつけ、
念のためにとテーブルの定義を調べ、やっぱりカラム名は間違ってないよなぁ~と悩みます。

勘のいい人は、そもそもメッセージにある’ABC001’って何のこと?
もしかして、$input_data の中身?と気づくので、解決は早いかも。

実はこのSQL文、何百件も正常に処理した後で、突然エラーになることがある。
データの後片付けは大変かも知れないが、その方がある意味幸せかも。

だって「データが悪いよな!」と直ぐ気づくから。

ためしにSELECT文の直前にPHPで、
「$input_data = 12345;」と書き加えても全然問題ないが、
「$input_data = “ABC001”;」と書くと「SQLSTATE[42S22]: Column not found:」がでた!
みごとに再現しますね。

解決策

どうやら、$input_data の中身が文字列だとカラム名だと判断しているようです。
そこで、対策は次のようにSQL文を修正すること。

SELECT * FROM table_a WHERE column_a = '$input_data';

WHERE句の変数「$input_data」をシングルクォーテーションで囲んだだけです。

これで ありもしないカラム名に惑わされることはありません。

めでたし めでたし。

ちなみに PHPなどはクオートしない文字列の非推奨化がすすんでいるけど、SQLも同様の動きになるかもね。

スポンサーリンク
タイトルとURLをコピーしました