人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

●質問者: redice
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL PHP エンコード サーバー サービス
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● pahoo
●50ポイント ベストアンサー

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


コメントに記したように、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を使う」をご覧ください。

◎質問者からの返答

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

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


2 ● agguy
●30ポイント

方法は

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

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

で問題ないと思います。

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

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

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

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


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

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

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

◎質問者からの返答

ありがとうございます。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ