PHP+MySQLで運用中のシステムについて、レンタルサーバー会社を変更したところ、MySQLに格納した日本語のデータが文字化けを起こしています。


レンタルサーバー(共有サービス)のため、PHPやMySQLの設定は変更できず、スクリプト側で対処するしかないのですが、今後もサーバーを変更する可能性がありますので、サーバー環境にはなるべく依存しないような形にしたいと思います。

そこで、日本語のデータは全てPHPのurlencode関数でエンコードしてからMySQLに格納し、取り出したデータはurldecode関数でデコードして使うようにすればよいのではないかと考えました。

実際にテストスクリプトを書いて試してみると、問題なくデータの格納・取り出しは出来ているようなのですが、このような方法を取った場合、何か考えられる問題点はありますでしょうか?

(また、もしもっとスマートな方法があれば、教えていただければ幸いです。)

回答の条件
  • 1人2回まで
  • 登録:2009/01/17 16:05:50
  • 終了:2009/01/18 01:40:48

ベストアンサー

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/01/17 18:37:28

ポイント50pt

回答設定変更をありがとうございました。


コメントに記したように、URLエンコードすると、サイズが大きくなるので、カラム・サイズの設定に注意してください。

また、エンコード関数 rawurlencode とデコード関数 rawurldecode を利用することをお勧めします。

urlencode / urldecode 関数との違いは、半角スペースを '+' にするか否かという点だけですが、rawurlencode / rawurldecode の方がURLの表現方法を規定する RFC 1738 に基づいていますので、他への流用もしやすいです。


また、どの文字コードをエンコードしたかも大切ですね。

like 演算子で比較することを考えると、文字コードは、すべての DB, プログラムで統一した方が良いです。

Webでの利用を前提にすると、日本語以外のマルチバイト文字が利用できる UTF-8 が無難です。(携帯電話の絵文字に対応できないという欠点がありますが)


UNICODE の ASCII エンコードの一種として、日本語ドメイン名として使われている Punycode にエンコードするという方法もあります。RFC 3492で規定されています。

PHP のライブラリを拡張する形で Punycodeエンコード/デコードが可能になります。詳しくは「URL Encodeの代わりにPunycode Encodeを使う」をご覧ください。

id:redice

早速のご回答ありがとうございます。

教えていただいた通り、とりあえずは、rawurlencode / rawurldecode を使用して様子を見たいと思います。ありがとうございました。

2009/01/17 19:01:43

その他の回答(1件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/01/17 18:37:28ここでベストアンサー

ポイント50pt

回答設定変更をありがとうございました。


コメントに記したように、URLエンコードすると、サイズが大きくなるので、カラム・サイズの設定に注意してください。

また、エンコード関数 rawurlencode とデコード関数 rawurldecode を利用することをお勧めします。

urlencode / urldecode 関数との違いは、半角スペースを '+' にするか否かという点だけですが、rawurlencode / rawurldecode の方がURLの表現方法を規定する RFC 1738 に基づいていますので、他への流用もしやすいです。


また、どの文字コードをエンコードしたかも大切ですね。

like 演算子で比較することを考えると、文字コードは、すべての DB, プログラムで統一した方が良いです。

Webでの利用を前提にすると、日本語以外のマルチバイト文字が利用できる UTF-8 が無難です。(携帯電話の絵文字に対応できないという欠点がありますが)


UNICODE の ASCII エンコードの一種として、日本語ドメイン名として使われている Punycode にエンコードするという方法もあります。RFC 3492で規定されています。

PHP のライブラリを拡張する形で Punycodeエンコード/デコードが可能になります。詳しくは「URL Encodeの代わりにPunycode Encodeを使う」をご覧ください。

id:redice

早速のご回答ありがとうございます。

教えていただいた通り、とりあえずは、rawurlencode / rawurldecode を使用して様子を見たいと思います。ありがとうございました。

2009/01/17 19:01:43
id:agguy No.2

agguy回答回数136ベストアンサー獲得回数32009/01/17 21:46:11

ポイント30pt

方法は

urlencode関数でエンコードして格納し、

urldecode関数でデコードして取り出す。

で問題ないと思います。

MySQLに限ったことではありませんが、

UTF-8を使うと日本語が3バイト文字になります。

EUCでもS-JISでも2バイトですので

DBへの格納時には文字コードの違いによるレングスに注意が必要です。


たとえばPHPで日本語をダブルバイトでカウントして、

インサート時にUTF-8で突っ込んでレングスオーバーで

インサートできないってことがありえます。

id:redice

ありがとうございます。

エンコード・デコードについては問題無いということで、安心しました。

2009/01/17 22:37:50
  • id:chuken_kenkou
    「=」条件ならともかく、範囲条件などの検索、order byでのソートなどが意図した通りにできないのでは?
  • id:pahoo
    URLエンコードは、より多くの格納領域を必要とするなどのデメリットはありますが、メリットの方が大きいと思います。
    ただ、ご質問の場合、urlencode 関数以外の方法をお勧めします――回答拒否を受けているので、残念ながら、お答えできませんが。
  • id:redice
    chuken_kenkou様、pahoo様、コメントありがとうございました。

    > 回答拒否を受けているので、
    回答を拒否するつもりは全くないのですが、「他ユーザーの設定による回答拒否」の部分でしょうか?
    デフォルトの設定を変更してみましたので、あらためてご回答いただければ幸いです。

    お手数ですが、どうぞよろしくお願い致します。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません