久しぶりに発生するとムダに悩むケースです。
ちょっとエラー・メッセージがトリッキーになってしまう場合なので。
状況
実行した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も同様の動きになるかもね。