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

MySQLの文字コードに関する質問です

テーブル名 item_info
フィールド名 item_id item_title

item_titleは全角日本語を入れています。

PHPでMySQLからデータを引っ張ってきて表示させています。
echo "id: ".$ro['item_id']."\n";
echo "title: ".$ro['item_title']."\n";

するとこうなってしまいます。

id: 1
title: ???

item_titleに入れているデータが文字化けするのです。
ソースが???になっているのでブラウザの問題では無いです。

違うサーバーだと正常に表示されます。MySQLの文字コード関係の設定ではないかと推測します。phpMyAdminを見て文字コードと関係のあるところをピックアップしました。

*****文字化けするサーバーのMySQL設定*****
MySQL 5.1
MySQL の文字セット: UTF-8 Unicode (utf8)
MySQL 接続照合順序: ujis_japanese_ci

テーブルitem_infoのitem_titleの接続照合順序はsjis_japanese_ciになっています。

*****正常に表示されるサーバーのMySQL設定*****
MySQL 4.0
MySQL の文字セット:ujis
接続照合順序に関しては表示されていません。

これだけの情報でおわかり頂けるかどうか・・。
もしわかる方がいらっしゃったら教えてください。

●質問者: tokyosmash
●カテゴリ:インターネット ウェブ制作
✍キーワード:echo MySQL PHP phpMyAdmin RO
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● きゃづみぃ
●20ポイント

http://pbx.homeunix.org/p_blog/rss/1.0.php?tid=320

こちらの以下の引用部分で 解決できますでしょうか?



# 解決方法

fnc_base.inc.phpの function db_connect() に SET NAMES 文を追加

if ($link && mysql_select_db($dbname)) {
mysql_query("SET NAMES $cfg['mysql_lang']");
return $link;
} else {


実際にはPHPとMySQLで文字コード名が違う(UTF-8とutf8とか)ので、このままでは動きませんが、SET NAMES 文を入れるだけで以下のような動作になります。

【ブラウザ】 → 自動判別 → 【PHP】 → $cfg['mysql_lang'] → 【MySQLクライアント・ライブラリ】→ $cfg['mysql_lang'] → MySQLサーバー

この辺については『現場で使えるMySQL』の「6. 日本語処理」が詳しいです。現状のP_BLOGは「Column デフォルト文字コードlatin1での日本語の扱い」の状態かと思われます。

【重要】とは言え、今問題なく動いている方はLatin1で格納されているわけで、これをやみくもに SET NAMES $cfg['mysql_lang'] してしまうと、既存の方々が文字化けしてしまいます! SET NAMES latin1 すればいいのですがPHP側で問題が出るので、$cfg['mysql_lang']周りの実装方法を再検討する必要があるかも知れません。


2 ● b-wind
●20ポイント

MyNA Web Site

色々と情報が足りないので、リンク先を見て試してみてください。

◎質問者からの返答

情報ありがとうございます。

kurukuru-nekoさん情報から

mysql_client_encodingを試してみたところ

latin1と帰ってきました。

リンク先で同じことが書いてありました。。

MySQLの文字コードがメチャクチャになっているんだと思います。どうもありがとうございます。


3 ● Yota
●20ポイント

phpMyAdminの結果はあまり当てにしないほうがいいですよ。

クライアントとしてのcharacter setを設定をしている可能性があるので。

テストスクリプトを作って

$sql = "SHOW VARIABLES LIKE 'character%'" ;

の結果セットを見たほうがいいです。

下のようになればクライアントもサーバもEUC-JPで、元のスクリプトがそのまま使えるはずです。

character_set_client ujis

character_set_connection ujis

character_set_database ujis

character_set_filesystem binary

character_set_results ujis

character_set_server ujis

character_set_system utf8

◎質問者からの返答

character_set_client utf8

character_set_connection ujis

character_set_database sjis

character_set_filesystem binary

character_set_results utf8

character_set_server utf8

character_set_system utf8


こんな感じになります。

見事にばらばらなんですが。。


4 ● Yota
●20ポイント

個人的にはコンパイルの段階からeuc-jpを想定してやれば問題ないと思うのですが、いまさらという感じもしますので、以下のことを試してみたらどうでしょう。

他の回答とかぶりますが、my.cnfまたはmy.iniに追加する。

[mysqld]

default-character-set = ujis

skip-character-set-client-handshake

[client]

default-character-set = ujis

[mysqldump]

default-character-set = ujis

mysqlデーモン再起動後、もう一度SHOW VARIABLES LIKE 'character%の結果を見る。


5 ● kurukuru-neko
●20ポイント

character_set_client

character_set_connection

character_set_results

mysql_query("set character set ujis");

で同時に変更可能。

character_set_databaseはDBをに記録されている

文字コードなのでDBの修正必要。

再度作りなおすかalter databaseでDEFAULT

CHARSETを変更。

テーブルも同様に修正が必要。

DB/テーブル内部コードがSJISならそのまま

で運用可能ですが。 EUCに統一が望ましい

と思います。(文字化けの原因なので)

my.cnfの修正する方法既出なので省略

◎質問者からの返答

解決しました。

my.cnfは編集できない環境なので諦めかけたのですが、

http://phpbb.xwd.jp/viewtopic.php?p=1170

こちらの情報を見て

mysql_query("SET NAMES sjis", $l);

($lはDBへの接続情報です)

を記述すると正常に表示されるようになりました。

なぜsjisなのか・・。ujisでもutf-8でもダメでした。

色々と検索しているとMySQL4.1以降で文字化けする例がたくさんあるようですね。

レンタルサーバーの仕様を見ているとMySQL4.0が多いのですが、やはりその辺が影響しているのでしょうか。

とりあえずうまくいきましたが、文字コードって複雑でよくわかりません。

アジア人は損してると思っているのは自分だけでしょうか?

みなさんありがとうございました。

関連質問


●質問をもっと探す●



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