(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」の頭に「`」の様な特殊文字がありますし・・・。
乱文で失礼致しました。
どなたかご教授頂ければ幸いです。
よろしくお願い致します。
お礼
ご回答ありがとうございます。 「Oracle8i NLSガイド」に『データベース作成後のキャラクタ・セットの変更』という章があったので、 そこに書かれていた以下の処理を実行しました。 SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_ORICESSES=0; ALTER DATABASE OPEN; ALTER DATABASE CHARACTER SET JA16SJIS; SHUTDOWN IMMEDIATE; STARTUP; そして、再度 SELECT NLS_CHARSET_NAME(1) FROM DUAL; や SELECT VALUE FROM NLS_DATABASE_PARAMETERS; などを実行して文字コードを確認してみましたが、 US7ASCIIから変更されていませんでした・・・。 しかもなぜか、Object Browserでテーブルの詳細を見ようとすると、 Object Browserが落ちるようになってしまいました。。。(汗) 文字コードの変更前に実行したALTER SYSTEM文が原因でしょうか? ご教授お願い致します。