トップ回答者
SQL Server2003とPHPを使用した際に起こる文字化け

質問
-
こんにちは
PHP言語で社内の簡単なシステム製作をしているのですが
壁にぶち当たり、ご教授頂けたらなと質問させていただきます。
PHPでの文字コードを
php.iniの設定でEUC-JPで統一して製作をしようかなと思っていたら
DBの内容だけが文字化けしてしまっています。
他のフォーラムや質問掲示板で探してみたのですが
何も指定しないままだとShift-JISでDBに登録されてしまう事まではわかったのですが
そこから文字コードをEUC-JPに変換する方法が見当たりません。。。
なんかODBC接続の際、AutoTranslate機能を使うとか使わないとかっていうのを耳にして
ヘルプなどで調べてはみたのですが、肝心の実装の仕方が記されていなくて
お手上げ状態です。
上記以外で他に効率のいいやり方などでもいいので
アドバイスよろしくお願いします。
回答
-
マニュアルを見る限りでは、http_input; POST/GET などの入力のエンコーディング, internal_encoding: データベースへの文字列送信時などの内部的なエンコーディング, http_output: HTML を出力する時のエンコーディング、と理解しています。encoding_translation は http_input -> internal_encoding -> http_output の各 -> の部分でエンコーディングの変換を行うかどうかの設定と理解しています。ここまでの議論で私が先のことを述べた理由はこのような理解をしているからによります。これが誤りである場合は先のポスト(導き出される考え)も誤りであるでしょう。
php から SQL Server を使うことはできるはずです。普段からそれをやっている方から追加の投稿があるかもしれません。
すべての返信
-
返信ありがとうございます。
もう一度php.iniの設定やphpinfo()で見直してみましたが、
問題ありませんでした。(問題なかったら文字化けしてないかな・・・
php自体の文字コードはEUC-JPになってる模様です。
DBの中身はShift-JISのまんまのようです。
前にPHPプログラムで
DBの中身がShift-JISならmb_convert_encodingで"EUC-JP"に変換すればと
考えたのですが、SELECTやINSERTなどの量が多く、無駄に行喰っちゃうかな~と思い断念しました。DB内では正常に入っている値をSELECTで取り出すと文字化けし、
逆にこちらからINSERTで挿入すると、DB内の値が文字化けして入ってしまいます。
説明下手でご理解していただくのに
苦労おかけすると思いますが、よろしくお願いします。
-
mbstring
Directive Local Value Master Value
mbstring.detect_order auto auto
mbstring.encoding_translation On On
mbstring.func_overload 0 0
mbstring.http_input auto auto
mbstring.http_output EUC-JP EUC-JP
mbstring.internal_encoding EUC-JP EUC-JP
mbstring.language Japanese Japanese
mbstring.script_encoding ←この項目は検索かけても見当たりませんでした。mbstring.substitute_character no value no value
設定で間違っているとすればmbstringの項目だと思うのですが
mbstringじゃなくて違うところでしたら、ご指摘ください。
ご迷惑おかけします。
よろしくお願いします。
追記:
mbstring.encoding_translationを見落としていて
Offにしてみましたが、結果変わらずじまいでした。
-
hmd1985 さんからの引用 mbstring.http_input auto auto
mbstring.http_output EUC-JP EUC-JP
mbstring.internal_encoding EUC-JP EUC-JP -
-
hmd1985 さんからの引用 ちなみに文字化けが起こるのは、varcharでcharでいれてる年月日や項番などは正常に表示してくれています。
年月日や項番は半角英数字だから文字化けしないだけではないでしょうか。char 型のフィールドに漢字などを入れてみても文字化けしませんか?char 型では漢字も文字化けしないのならば、varchar の長さに問題があるかもしれません。php では varchar の長さは 255 までに限定されているという記述があります。
char 型に漢字を入れた場合に文字化けせず、varchar も 255 より短いのに文字化けがおきるケースはよくわかりません。char 型に漢字を入れた場合も文字化けするなら、すべて SJIS で統一して期待通りに表示できることを確認してから少しずつ設定を変えていったほうがいいのではないでしょうか。
hmd1985 さんからの引用 私が睨むにSQL Server内部の文字コードだと思うのですが検討ちがいですか?
うーん。よく意味がわかりません。
-
返信ありがとうございます。
char型の項目に半角英数以外を入力すると文字化けしてしまいました。
一回全てShift-JISに戻し、少しずつ設定を変更していく事にします。
SQL Server内部の文字コードの事なんですが
PHPで書いたechoやprintで出力させる文字は文字化けしていないのに
SELECTなどで引っ張ってくる値だけ文字化けしていたので
もしかしてSQL Serverの設定側の問題かなと思って、このフォーラムに書き込んでみました。
PHP側の問題じゃ絶対ないと頭の中で思っていたので
もしかしたら以前の設定で見落としている箇所があり、そこで文字化けしてるかもしれないですね。
SQL Serverフォーラムに書き込む内容ではないのに
ご丁寧に答えてくださってありがとうございました。
一からPHP側の設定を見直してみることにします。
-
マニュアルを見る限りでは、http_input; POST/GET などの入力のエンコーディング, internal_encoding: データベースへの文字列送信時などの内部的なエンコーディング, http_output: HTML を出力する時のエンコーディング、と理解しています。encoding_translation は http_input -> internal_encoding -> http_output の各 -> の部分でエンコーディングの変換を行うかどうかの設定と理解しています。ここまでの議論で私が先のことを述べた理由はこのような理解をしているからによります。これが誤りである場合は先のポスト(導き出される考え)も誤りであるでしょう。
php から SQL Server を使うことはできるはずです。普段からそれをやっている方から追加の投稿があるかもしれません。