重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

言語がPHP(SJIS)でDBがMySQL(Unicode)の環境で運用しているページがあるのですが、文字コードの変換で謎が謎を呼び始めたので質問します。
(1)フォームからの保存で「ソ」の文字を保存するとDB上で「ソ\」になります。
→コード変換ミス(5c=\)で理解しました。

(2)「ソ\」で保存されたデータをフォームに呼び出すと「ソ\」と表示される。
→UTF8で「5C=\」だから??

(3)上記を回避したくPHPでstripslashesを追加してみると、「ソ」の表示が「メ」になってしまっている。

なぜこうなるのか??回避できないのか??
という点で不思議と謎につつまれているのですが、コメントお願いします。

A 回答 (2件)

自分も先日、同じような問題に遭遇しました。



接続直後に
mysql_query("SET NAMES binary");
を一行加えることで解決すると思います。

SJISの文字列をバイナリのデータとしてMySQLに渡します。
クエリ生成の段階でmysql_read_escape_string()などの関数できちんとエスケープしていれば、SQLインジェクションの問題は防げると思います。

この回答への補足

ありがとうございます。
mysql_query("SET NAMES binary")
ですが、DB接続後にすでに
mysql_query("SET NAMES sjis")
の記述があり、それを変更すると全ての文字が文字化けし、
追加するとエラーが発生します。

この場合どのように考えて処置すればいいでしょうか?

補足日時:2006/11/09 10:33
    • good
    • 0

PHPは素人ですが。



「ソ\」はSJISでは 835C 815F ですね。
でここからバックスラッシュ(ASCIIで5C)を取ると
83815F
8381はSJISでは「メ」、ASCIIで5Fは「_」(アンスコ)
    • good
    • 0
この回答へのお礼

コードの細かな説明ありがとうございます。
こう見ると必然なんですね。
困る事には変わりないのだけれど・・・。

後は解決策考えます!!

お礼日時:2006/11/09 10:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!