- ベストアンサー
文字化け:xamppを利用したphpとmysqlの組み合わせで・・2
環境 Windows XP ApacheFriends XAMPP (basic package) version 1.6.6a 再々投稿です。もう本当にお手上げ状態です・・・ (http://oshiete1.goo.ne.jp/qa4147638.html) hrm_mmm様、いろいろとありがとうございました。 下記設定でも、文字化けが発生します。 XAMPPで文字化け解決された方、いらっしゃいませんか? 何かヒントをお願いします・・・助けてください。 ★mysql★ #This File was made using the WinMySQLAdmin 1.4 Tool #2008/07/09 10:24:05 #Uncomment or Add only the keys that you know how works. #Read the MySQL Manual for instructions [mysql] default-character-set =ujis [mysqld] default-character-set =ujis skip-character-set-client-handshake basedir=C:/xampp/mysql #bind-address=xx.xx.xx.xx datadir=C:/xampp/mysql/data #language=C:/xampp/mysql/share/your language directory #slow query log#= #tmpdir#= #port=3306 #set-variable=key_buffer=16M [WinMySQLadmin] Server=c:/xampp/mysql/bin/mysqld-nt.exe user=root password=1234 [mysqldump] default-character-set =ujis ★PHP★ [mbstring] mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = PASS mbstring.encoding_translation = Off mbstring.detect_order = auto mbstring.substitute_character = none; mbstring.func_overload = 7 ★ソース★ $dbconnect = mysql_connect(DB_HOST,DB_USER,DB_PASS) or die("サーバーに接続できません"); // データベース セレクト mysql_set_charset("ujis"); mysql_query("SET NAMES ujis",$dbconnect) or die("文字設定ができません"); mysql_query("SET CHARACTER SET UJIS",$dbconnect) or die("文字設定ができません"); mysql_select_db(DB_NAME,$dbconnect) or die("データーベースに接続できません"); ソースは全てEUCで記述しています。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
私も xampp を利用して PHP と MySQL を使っています。 設定はいろいろやって結局よくわからなかったのですが、初期値のままでも文字化けしないような気がしています。 あまり関係ありませんが PHP のバージョンは 5 でしょうか。 私はいつも 4 を使っていますが、これもよくわからないまま設定を変えてしまっているので、xampp の機能で 5 に切り替えてみてテストしてみました。 たぶん 5 としては初期値のままです。 文字化けはしたりしなかったりでした。 実はHTMLの事もよくわかっていません。 質問者様がどの時点で文字化けが発生しているのかわからないので、私がテストした内容で説明していきます。 ソースは EUC-JP で記述しています。 エディタがそう表示しているのですが、たぶん ujis と同じコードだと思っています。 あと、ブラウザ側のエンコードとやらで現象がかわってくるかも知れません。 1.これだけだと「あいう」が文字化けしました。 <?php echo "abcあいう"; ?> 2.PHPの部分は同じですが、これだと文字化けしませんでした。 <html> <head> <title>テスト</title> </head> <body> <?php echo "abcあいう"; ?> </body> </html> 以上、ただ単に文字を表示したら文字化けするかどうかのテストです。 3.MySQLからデータを読み込んで表示すると文字化けしました。 <?php $dbconnect = mysql_connect("localhost","user","") or die("サーバーに接続できません"); // データベース セレクト mysql_set_charset("ujis"); mysql_query("SET NAMES ujis",$dbconnect) or die("文字設定ができません"); mysql_query("SET CHARACTER SET UJIS",$dbconnect) or die("文字設定ができません"); mysql_select_db("test",$dbconnect) or die("データーベースに接続できません"); $sql = "select * from test_1"; $res = mysql_query($sql,$dbconnect); $row = mysql_fetch_assoc($res); ?> <html> <head> <title>テスト</title> </head> <body> <?php echo $row["name"]; ?> </body> </html> テーブル test_1 には name と言う項目があって、そこに「abcあいう」を入れています。 test_1 は phpMyAdmin で作成し、データの挿入もそこからしています。 テーブル作成時に表示されたSQLです。 CREATE TABLE `test`.`test_1` ( `code` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR( 64 ) NOT NULL , PRIMARY KEY ( `code` ) ) ENGINE = MYISAM データ挿入時に表示されたSQLです。 INSERT INTO `test`.`test_1` ( `code` , `name` ) VALUES ( NULL , 'abcあいう' ); 実は、この時、ワーニングが発生していました。 Warning: #1366 Incorrect string value: '\xE3\x81\x82\xE3\x81\x84...' for column 'name' at row 1 データの挿入はされたようですが、ワーニングが出てます。 phpMyAdmin でデータを確認すると、「abc???」になっています。 4.新たにテーブル test_2 を作成してテスト。 PHPのソースは test_1 が test_2 になるだけです。 テーブル作成時に表示されたSQLは、今度はこうです。 CREATE TABLE `test`.`test_2` ( `code` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR( 64 ) CHARACTER SET ujis COLLATE ujis_japanese_ci NOT NULL , PRIMARY KEY ( `code` ) ) ENGINE = MYISAM 作成する時の項目の設定で、照合順序のところで「ujis」の「ujis_japanese_ci」を選択しました。 同じようにデータを挿入すると、今度はワーニングが出ませんでした。 phpMyAdmin でデータを確認すると、正しく表示されました。 3のソースを test_2 にしたものを実行すると、文字化けしませんでした。 結果、問題はデータベース側の文字コードかなと思っています。 現在のデータベースの照合順序、項目の照合順序を確認してみてください。 私の文字化けした test_1 の項目は「latin1_general_ci」でした。 データベースも「latin1_general_ci」となっていました。 データベースを作成する時に、データベースの照合順序を「ujis_japanese_ci」にしておけば、テーブル作成時にはそれが初期値とされ、項目ごとに設定する必要はなさそうです。 とりあえず、PHPとMySQLの設定はそのままで、データベースの照合順序を確認してみてください。
その他の回答 (3)
- dell_OK
- ベストアンサー率13% (766/5720)
ANo.3のchukenkenkou様、参考記事のURLありがとうございます。 私がお礼を言うのも筋違いですが、勉強になりましたので感謝です。 my.cnfの3行の変更と追加だけで、解消されるんですね。 私が最初に手にした本では、詳しくではありますが、 他にもいろいろと設定があったので、どれがどう関係してくるのか、 いまいち理解できずにいました。 この3行だけでデータベース側はよさそうなので、 しばらく、これで使用して、動作確認をしようと思っています。 ただ、記事に載っているXAMPPのバージョンが 1.6.6a でないのか、 インストールされたmy.cnfを直接修正しようとしても、 この3行の位置はありませんでした。 この記事の前の記事を読もうとしたのですが、 記事サイトのリンクがうまくいってないのか記事一覧しか読めなくて、 詳しくは確認できませんでした。 なので 1.6.6a の使用の際の注意として、 初期インストールされる my.cnf は使わずに、 それは名前を変えて置いておくとして、 my_example.cnf を my.cnf でコピーして、 これに対して、例の3行の変更追加をすれば、 この問題は解決されると言う事になるかと思います。 初期のmy.cnfとmy_example.cnfの相違はよくわからないので、 あくまで、初期にほど近い設定と言う事での使用になると思います。
- chukenkenkou
- ベストアンサー率43% (833/1926)
こんな記事がありますが、参照済ですか? http://allabout.co.jp/internet/database/closeup/CU20080616A/
お礼
ずいぶん返信がおそくなり、申し訳ありません。 非常に参考になる記事をありがとうございます。 最近、検索してもBLOGばっかりHITしたり 目的のサイトを見つける検索ワードが思いつかなかったり、 検索も大変になってきました。 情報が多すぎて・・・ 本当にありがとうございます。
- dell_OK
- ベストアンサー率13% (766/5720)
ANo.1の補足。 「ブラウザのエンコード~」については、以下のタグで解消されるのかな。 <head> の次に、以下のタグを挿入してください。 <meta http-equiv="Content-type" content="text/html; charset=euc-jp">
お礼
dell_OK様 本当にありがとうございます。 データベースを作成する時に、データベースの照合順序を「ujis_japanese_ci」にしておけば、 テーブル作成時にはそれが初期値とされ、項目ごとに設定する必要はなさそうです。 これですべてが解決しました。 文字化けも発生せず、ujisで使用することが可能となりました。 実は、諦めてUTFにすべて変えようと考えていたところでした。 本当に、本当にありがとうございました。