none
SQL Server2003とPHPを使用した際に起こる文字化け RRS feed

  • 質問

  • こんにちは

     

    PHP言語で社内の簡単なシステム製作をしているのですが

    壁にぶち当たり、ご教授頂けたらなと質問させていただきます。

     

    PHPでの文字コードを

    php.iniの設定でEUC-JPで統一して製作をしようかなと思っていたら

    DBの内容だけが文字化けしてしまっています。

     

    他のフォーラムや質問掲示板で探してみたのですが

    何も指定しないままだとShift-JISでDBに登録されてしまう事まではわかったのですが

    そこから文字コードをEUC-JPに変換する方法が見当たりません。。。

     

    なんかODBC接続の際、AutoTranslate機能を使うとか使わないとかっていうのを耳にして

    ヘルプなどで調べてはみたのですが、肝心の実装の仕方が記されていなくて

    お手上げ状態です。

     

    上記以外で他に効率のいいやり方などでもいいので

    アドバイスよろしくお願いします。

    2007年11月27日 3:20

回答

  • マニュアルを見る限りでは、http_input; POST/GET などの入力のエンコーディング, internal_encoding: データベースへの文字列送信時などの内部的なエンコーディング, http_output: HTML を出力する時のエンコーディング、と理解しています。encoding_translation は http_input -> internal_encoding -> http_output の各 -> の部分でエンコーディングの変換を行うかどうかの設定と理解しています。ここまでの議論で私が先のことを述べた理由はこのような理解をしているからによります。これが誤りである場合は先のポスト(導き出される考え)も誤りであるでしょう。

     

    php から SQL Server を使うことはできるはずです。普段からそれをやっている方から追加の投稿があるかもしれません。

    2007年11月27日 6:28

すべての返信

  • このあたりこのあたりはチェックされましたか?

    2007年11月27日 3:37
  • 返信ありがとうございます。

     

    もう一度php.iniの設定やphpinfo()で見直してみましたが、

    問題ありませんでした。(問題なかったら文字化けしてないかな・・・

     

    php自体の文字コードはEUC-JPになってる模様です。

    DBの中身はShift-JISのまんまのようです。

     

    前にPHPプログラムで

    DBの中身がShift-JISならmb_convert_encodingで"EUC-JP"に変換すればと
    考えたのですが、SELECTやINSERTなどの量が多く、無駄に行喰っちゃうかな~と思い断念しました。

     

    DB内では正常に入っている値をSELECTで取り出すと文字化けし、

    逆にこちらからINSERTで挿入すると、DB内の値が文字化けして入ってしまいます。

     

    説明下手でご理解していただくのに

    苦労おかけすると思いますが、よろしくお願いします。

    2007年11月27日 4:19
  •  hmd1985 さんからの引用

    もう一度php.iniの設定やphpinfo()で見直してみましたが、

    問題ありませんでした。(問題なかったら文字化けしてないかな・・・

    php.ini の設定や phpinfo() の結果をここに貼り付けてみたらどうでしょう。

    2007年11月27日 4:28
  • 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にしてみましたが、結果変わらずじまいでした。

    2007年11月27日 4:41
  •  hmd1985 さんからの引用

    mbstring.http_input                   auto              auto
    mbstring.http_output                 EUC-JP         EUC-JP
    mbstring.internal_encoding        EUC-JP         EUC-JP

     

    やりたいことからすると、SQL Server の文字列型を varchar/char で定義しているなら http_input = EUC-JP, internal_encoding = SJIS, http_output = EUC-JP, SQL Server の文字列型を nvarchar/nchar で定義しているなら http_input = EUC-JP, internal_encoding = UTF-8, http_output = EUC-JP にすればいいんじゃないですか?もちろん encoding_translation = On でしょう。
    2007年11月27日 5:12
  • 返信ありがとうございます。

     

    internal_encoding = SJISに変え、input・outputはEUC-JPでやってみたのですが

    変わらず文字化けしていました。

     

    私の説明不足でした。

    すみません。

    SQL Serverの文字列型はvarchar/charで定義しております。

    ちなみに文字化けが起こるのは、varcharでcharでいれてる年月日や項番などは正常に表示してくれています。

     

    私が睨むにSQL Server内部の文字コードだと思うのですが検討ちがいですか?

     

    お手数おかけしますが、よろしくお願いします。

    2007年11月27日 5:39
  •  hmd1985 さんからの引用

    ちなみに文字化けが起こるのは、varcharでcharでいれてる年月日や項番などは正常に表示してくれています。

    年月日や項番は半角英数字だから文字化けしないだけではないでしょうか。char 型のフィールドに漢字などを入れてみても文字化けしませんか?char 型では漢字も文字化けしないのならば、varchar の長さに問題があるかもしれません。php では varchar の長さは 255 までに限定されているという記述があります。

    char 型に漢字を入れた場合に文字化けせず、varchar も 255 より短いのに文字化けがおきるケースはよくわかりません。char 型に漢字を入れた場合も文字化けするなら、すべて SJIS で統一して期待通りに表示できることを確認してから少しずつ設定を変えていったほうがいいのではないでしょうか。

     

     hmd1985 さんからの引用

    私が睨むにSQL Server内部の文字コードだと思うのですが検討ちがいですか?

    うーん。よく意味がわかりません。

    2007年11月27日 5:55
  • 返信ありがとうございます。

     

    char型の項目に半角英数以外を入力すると文字化けしてしまいました。

    一回全てShift-JISに戻し、少しずつ設定を変更していく事にします。

     

    SQL Server内部の文字コードの事なんですが

    PHPで書いたechoやprintで出力させる文字は文字化けしていないのに

    SELECTなどで引っ張ってくる値だけ文字化けしていたので

    もしかしてSQL Serverの設定側の問題かなと思って、このフォーラムに書き込んでみました。

     

    PHP側の問題じゃ絶対ないと頭の中で思っていたので

    もしかしたら以前の設定で見落としている箇所があり、そこで文字化けしてるかもしれないですね。

     

    SQL Serverフォーラムに書き込む内容ではないのに

    ご丁寧に答えてくださってありがとうございました。

     

    一からPHP側の設定を見直してみることにします。

    2007年11月27日 6:15
  • マニュアルを見る限りでは、http_input; POST/GET などの入力のエンコーディング, internal_encoding: データベースへの文字列送信時などの内部的なエンコーディング, http_output: HTML を出力する時のエンコーディング、と理解しています。encoding_translation は http_input -> internal_encoding -> http_output の各 -> の部分でエンコーディングの変換を行うかどうかの設定と理解しています。ここまでの議論で私が先のことを述べた理由はこのような理解をしているからによります。これが誤りである場合は先のポスト(導き出される考え)も誤りであるでしょう。

     

    php から SQL Server を使うことはできるはずです。普段からそれをやっている方から追加の投稿があるかもしれません。

    2007年11月27日 6:28