pg_escape_string の罠
こんなソースがありました。
mb_internal_encoding('EUC-JP'); // DB の文字コードはUTF-8 でコンパイルされている $sql = "INSERT INTO table (name) VALUES ('".pg_escape_string("司'")."')"; pg_exec("SET client_encoding TO 'EUC-JP'"); pg_exec($sql);
だめなのね。文字の組み合わせによって、シングルクオートがちゃんとエスケープされないことがある。
というのも、pg_escape_string() はPostgreSQL のPQescapeString() の呼び出しを代替しているだけだから、スクリプトの内部文字コードではなく接続したDBの文字コードの影響を受ける。
上記の例ではpg_escape_string() が呼び出されたとき、DB 接続のクライアント文字コードは未指定だから文字列はUTF-8 として扱われてしまう。
踏まえて、正しくは下記。
mb_internal_encoding('EUC-JP'); // DB の文字コードはUTF-8 でコンパイルされている pg_exec("SET client_encoding TO 'EUC-JP'"); $sql = "INSERT INTO table (name) VALUES ('".pg_escape_string("司'")."')"; pg_exec($sql);