みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

(mysql_set_charset)PHPでINSERTした時の文字

(mysql_set_charset)PHPでINSERTした時の文字化け

現在、独学でPHPを弄っているのですが
文字化けが起こってしまい色々調べたのですが理解できていないのでこちらで質問させていただきます。

海外・日本向けのホームページを作成中で
日本向けのHTMLについては、
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
海外向けのHTMLについては、
<meta http-equiv="content-type" content="text/html; charset=utf-8">
と、設定。

データベースの設定は(全てを理解していないのでコピー)
MySQL:MySQL の文字セット: UTF-8 Unicode (utf8)
MySQL 接続の照合順序:utf8_general_ci
各テーブル照合順序:utf8_general_ci
各カラムは数値の部分のみ)int、文字列についてはvarchar、utf8_general_ciです。

PHPのver:5.2.14
(レンタルサーバーはsakuraインターネットです。)

そこで日本向けのHPからINSERTを行ったところ、
DB内を見ると文字が入っていない状態だったり、文字化け(イ.イイイ(適当))な感じになり
非常に苦戦しております。

私的思考では
『utf8のDBにutf8以外の文字コード(shift_jisやらeuc等)で書き込むから文字化けするのであって
書き込む時にutf8に変換してやれば良い。』と思っております。
(この時点で解釈が間違っているのであれば遠慮無くご指摘頂ければ幸いです。)

そこで色々調べてみたのですが
mysql_set_charset()関数を記述すると良いとの記事がありました。
ですがこの関数について解釈がままならず・・・(涙

例えばこの関数は
$link = my_mysql_connect($host, $user, $passwd)
$tmp = mysql_set_charset('sjis', $link);
utf8で書き込みをしたutf8の文字コード(データ)をsjisとして表示してくれる訳でしょうか?
簡単に言えば
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">と同様の意味でしょうか?

また、PHPからINSERTする時の変換についてはINSERT前に
mb_convert_encoding()
で変換しなければならないのでしょうか?

また、表示もそうですが
海外向け・日本語向けのHPを作成する際はDBを分割するべきなのでしょうか?
イタリア語やフランス語については「e」の頭に「`」の様な特殊文字がありますし・・・。

乱文で失礼致しました。
どなたかご教授頂ければ幸いです。
よろしくお願い致します。

投稿日時 - 2010-09-27 00:19:38

QNo.6210503

困ってます

質問者が選んだベストアンサー

すでにUTFで環境を構築されているならミドルウェア側で変換することをお勧めします。
多言語コードで格納されていると検索する際にヒットしなくなります。

また、SJISはインジェクションの問題が完全には対応できないためお勧めしません。
どうしてもというのであれば検索性をすててバイナリとしてデータを格納するだけを
目指すのも手かもしれません

投稿日時 - 2010-09-27 09:30:08

補足

お早い返答有難う御座います。
またお伺いしたいのですが、
>すでにUTFで環境を構築されているなら・・・
とありますが、まだ始めたばかりですのでもし多言語に対応する環境があるのであれば
お教え頂ければそちらに切り替えようと思います。
その方が楽なのでorz

またミドルウェア側と言うのが少し私には難しいのですが(涙
http://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2
等、少し調べてみましたが
有力な情報があるサイトがありましたらご誘導お願いできませんでしょうか?(涙

厚かましいお願いで申し訳御座いません・・・

投稿日時 - 2010-09-28 04:08:19

ANo.1

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

とりあえずまず、日本語もUTF-8で作成して、全部統一させることをおすすめします。
日本語だからといって、SJISにする理由はとくに無いと思います。
何か特殊な事情があるなら、データベースに挿入する前にmb_convert_encoding関数でSJISをUTF-8に変換してください。
尚、正確には、SJISではなくてsjis-winで。
<?php
$value = mb_convert_encoding($value, 'utf-8', 'sjis-win');//sjis-winは括弧株とか特殊な文字も変換できる。

?>



その上で、MySQLで作成したデータベースと、PHPの文字コードの他に、Mysqlの設定ファイルに書いてある(または書いてなくてデフォルトで決まっている)文字コードの存在があります。

その設定ファイルに記述されている文字コードが正しく、utf8になっていなければ、文字化けが起きます。
それをスクリプト(クライアント)側から決めてやるのが、mysql_set_charsetになります。

ですので、
<?php
mysql_set_charset('utf8', $link);
?>
としてやるのが正解。
のはずです。

一度試してみてください。

尚、私は、
http://www.klab.jp/media/mysql/index6.html
こちらのサイトを参考に致しました。
勉強を進めていくうちにきっと必要な文書となると思いますので、ブックマークしておくと良いかもしれません。

投稿日時 - 2010-10-02 03:36:28

あなたにオススメの質問