SET NAMESを使わない方が良い

PHPからSET NAMESを使わない方が良い理由と対策まとめ | twk @ ふらっと

MySQL4なサバでは使ったりしてましたが。。

SQLの実行により文字コードが変更されるように思えるが、PHPのMySQL関連の関数で考慮される文字コードは変更されない。このため、エスケープ関数mysql_real_escape_string()等で、必要なエスケープがなされず脆弱性を引き起こすケースがある。

とのこと。mysql_set_charset()のほうを使おう!とのことです。

使いたい文字コードがShift_JISなら
入力文字列が正しい文字コードかチェックして、その上で自前のエスケープ用の関数を通せばOK
文字コードのチェックにはmb_check_encoding()またはmb_convert_encoding()を使えば良い。
自前のエスケープ用の関数では、Shift_JISの x00, n, r, , ‘, ” そして x1a をエスケープすれば良いはず。

これは良い情報ですね。古いPHPでShift_JIS使う時には覚えておこう。