ここから質問投稿すると、最大4000ポイント当たる!!!! >>

以下の現象に対処したいのですが、どうすればいいか弱っています。
(1) phpMyAdminからSQLでテーブルに日本語を挿入して、
PHPプログラムでブラウザー表示すると文字化け(?????で表示)する。
phpMyAdminでこのデータを表示すると、正しく日本語表示されている。
(PHPプログラム内で直接日本語データを記述して挿入しても同じ現象となる)
(2) ブラウザーで日本語を入力してPHPプログラムで受取りMySQLに出力して、
そのデータをPHPプログラムでブラウザー表示すると問題なく日本語が表示される。
phpMyAdminでこのデータを表示すると、文字化け(ぐじゃぐじゃの文字で表示)する。


利用しているホスティングサービスは、お名前・COMのVPSプラン
実行時の環境
MySQL: サーバのバージョン: 5.0.77
サーバ: Localhost via UNIX socket
MySQL の文字セット: UTF-8 Unicode (utf8)
MySQL の接続照合順序: utf8_unicode_ci
PHP : PHP5を使用
phpプログラムは、UTF-8で記述。
出力されるHTMLの文字セット
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />

このQ&Aに関連する最新のQ&A

A 回答 (2件)

MySQLに接続後に、mysql_set_charset('utf8');または(環境によっては)、"SET NAMES utf8"をクエリー発行してませんよね?



MySQL の接続照合順序: utf8_unicode_ci
は使い道が違うのか、クライアントからUTF8のクエリーを発行しても、PHPMyAdminでは文字化けしてしまうという事に散々悩まされました。
接続照合順序って言い方からすると、クライアントからのSQLの文字コードはUTF8であるという意味かと思えるのに。文字化けするって結果からみると、たぶん違うのでしょう。
※私自身、ここは理解できていません。ただ、mysql_set_charset('utf8');をすると文字化けせずに正常に登録されるので、それ以上の追求をしていない状態。

私が悩まされていたのと同じ現象なので、mysql_set_charset('utf8');でOKでしょう。
    • good
    • 1
この回答へのお礼

貴重なアドバイスありがとうございました。
下記の通り問題解決しました。
(1) mysql_set_charset('utf8');を現況環境下で使用できませんでした。(バージョンの問題と思います)
(2) SET NAMES utf8をクエリー発行したら、質問現象(1)が解消しました。同時に質問現象(2)についても意図通りに日本語が格納・表示できました。
うれしい!!!

お礼日時:2010/04/03 16:19

phpMyAdminはログイン時に文字コードセットを指定するようになっていますが、これがutf-8になっていないということはありませんか?


ご確認ください。
    • good
    • 0
この回答へのお礼

早速アドバイスをいただきましてありがとうございます。
phpMyAdminは、お名前・COMのコントロールメニューから入りまして、メインメニューに以下の内容が表示された状態で使用しました。
(ログイン要求は特にありません。)
--------------------------------------
localhost
サーバのバージョン: 5.0.77
プロトコルバージョン: 10
サーバ: Localhost via UNIX socket
ユーザ: root@localhost
MySQL の文字セット: UTF-8 Unicode (utf8)
MySQL の接続照合順序: utf8_unicode_ci
-----------------------------------------

お礼日時:2010/04/03 11:38

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMySQLとPHPで日本語が文字化けする。

MySQLとPHPでアプリを開発中です。
MySQLに登録済の日本語文字列データをPHPでselectして
echoを使ってクライアント(Windows XP)のブラウザに表示させると、
文字化けします。
全角文字がすべて半角の '?' になります。
MySQLの状態を調べるために以下を実行しました。
SHOW VARIABLES LIKE 'char%';

結果は以下のとおりでした。
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem  binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
character_sets_dir /usr/local/mysql5.0.51a/share/mysql/charsets/

PHPの内部エンコードはUTF-8です。
php.iniの関連設定は以下のとおりです。
default_charset = "UTF-8"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII
mbstring.substitute_character = "none"
mbstring.encoding_translation = On
extension_dir = "/usr/local/lib/php/extensions"
extension=php_mysqli.dll
extension = gd.so
extension = mysqli.so
extension = xmlrpc.so

MySQLもPHPもすべてUTF-8で統一したので問題ないはずだと
思ったのですが?
半角アルファベットは問題なく表示されます。
サーバー側OSはSolarisです。
MySQLから正しくデータを得られていないように思えるのですが。
ヒントでも結構ですから教えていただけるとありがたいです。
よろしくお願いします。

MySQLとPHPでアプリを開発中です。
MySQLに登録済の日本語文字列データをPHPでselectして
echoを使ってクライアント(Windows XP)のブラウザに表示させると、
文字化けします。
全角文字がすべて半角の '?' になります。
MySQLの状態を調べるために以下を実行しました。
SHOW VARIABLES LIKE 'char%';

結果は以下のとおりでした。
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem  binary
character_set_results utf8
character_s...続きを読む

Aベストアンサー

もしデータベース接続に MySQLi をご利用であれば、諸々のクエリを発行する前にデータベース接続の現在の文字コードセットを確認してください。

http://jp.php.net/manual/ja/mysqli.character-set-name.php
標準的な環境であれば、返される文字列は latin1 となっているはずです。

次にやるべきことは文字コードセットの指定です。
http://jp.php.net/manual/ja/mysqli.set-charset.php

希望する文字コードセットにてデータベース接続が準備できましたので、目的のクエリを発行し、データを取得してください。

また、このような手順がわずらわしいと感じる場合、接続のオブジェクトを生成する前に各種設定を施すことが出来ます。
http://jp.php.net/manual/ja/mysqli.options.php

my.cnf に代わってアプリケーション用に準備した設定ファイルを読み込ませ、ここに予め接続の文字コードセットを指定しておくのが便利です。
例えば .my.cnf という設定ファイルを作成し、この中に [PHP] セクションを準備すると分かりやすいかもしれません。

参考URL:http://jp.php.net/manual/ja/book.mysqli.php

もしデータベース接続に MySQLi をご利用であれば、諸々のクエリを発行する前にデータベース接続の現在の文字コードセットを確認してください。

http://jp.php.net/manual/ja/mysqli.character-set-name.php
標準的な環境であれば、返される文字列は latin1 となっているはずです。

次にやるべきことは文字コードセットの指定です。
http://jp.php.net/manual/ja/mysqli.set-charset.php

希望する文字コードセットにてデータベース接続が準備できましたので、目的のクエリを発行し、データを取得してく...続きを読む

Qテーブルに日本語が登録できない

xampp1.6.6をインストールし、mysqlを使ってデータベースの勉強をしているのですが、
コマンドプロントからtableにデータを登録すると日本語のみ綺麗に弾かれます。

例えば

insert into test(sample1,sample2,sample3) values('test1','テスト','test3');

とすると「1 warnings」と表示され、テストのとこのみ空欄になります。

php、mysql共に文字コードをutf8にしたのですが、これが原因でしょうか?

解決方法よろしくお願いします。

Aベストアンサー

まず、Ano.2さんのおっしゃられるとおりWindowsのコマ
ンドプロンプトは「SJIS」しか対応していません。

1.Mysqlにログイン
2.データベース選択
3.「SHOW VARIABLES LIKE 'char%';」コマンドを入力
 ※ここで「character_set_filesystem」以外「UTF8」
  出ない場合、設定不足が考えられます。
  ・character_set_databaseがlatin1などのばあい・・・
   =>UTF8環境でデータベースを作成していますか?
4.「set names cp932;」を入力
5.「Insert into~」を実行

※上記環境はMySQL5.0.45上で確認しました。
※但し、MySQL5.x系とWindowsのコマンドプロンプトはあ
 まり整合性が取れていないらしく、PHPやPhpMyAdmin等
 で確認すると正常に格納されているデータでも、コマン
 ドプロンプト上では表示がおかしくなるケースがあり
 ます。
 私の場合、5.0.51環境では日本語が「半角記号、カナ」
 等に文字化け、5.0.45では、ファイルからアップロード
 した場合、日本語部分を表示させたりすると他部分の表
 示が欠損する場合がありました。

 XAMPP1.6.6ですと、MySQLは5.0.51だと思いますが、ご
 参考までに。

参考URL:http://oshiete1.goo.ne.jp/qa3786052.html

まず、Ano.2さんのおっしゃられるとおりWindowsのコマ
ンドプロンプトは「SJIS」しか対応していません。

1.Mysqlにログイン
2.データベース選択
3.「SHOW VARIABLES LIKE 'char%';」コマンドを入力
 ※ここで「character_set_filesystem」以外「UTF8」
  出ない場合、設定不足が考えられます。
  ・character_set_databaseがlatin1などのばあい・・・
   =>UTF8環境でデータベースを作成していますか?
4.「set names cp932;」を入力
5.「Insert into~」を実行

※上記環境はMySQL5.0.45上...続きを読む

QphpMyAdmin内での文字化け

サーバはさくらインターネットを利用してます。
レンタルサーバから専用サーバに移転したのですが、
専用サーバではphpMyAdminで日本語データの文字化けが起きます。

専用サーバのphpMyAdminからDB作成の際、下記の設定で行い、

MySQLの文字セット UTF-8 Unicode (utf8)
MySQLの接続照合順序 utf8_unicode_ci
DB の照合順序 utf8_unicode_ci

レコードをINSERTする際、下記のように文字コードを指定し、
$sql=mb_convert_encoding($sql,"EUC-JP","EUC-JP");
execute_sql($con, $sql);

実行したら、phpMyAdmin内で日本語データが文字化けしました。
サイト内で表示しているDBデータ(日本語)は文字化けしませんでした。

DB の照合順序をutf8以外(ujis_japanese_ciなど)として、
DBを作った場合、レコードをINSERTしたら、サイト内のDBデータも
phpMyAdmin内データもどちらも日本語が文字化けします。

また、レンタルサーバのphpMyAdminからDBデータをエクスポートして、
専用サーバのphpMyAdminからインポートした場合、
読み込むDBデータファイルの文字コードをUTF-8にしなければ、
phpMyAdmin内で日本語データが文字化けしてしまいます。
ただ、UTF-8にしてインポートしてもphpMyAdmin内では
文字化けしませんが、サイト内で表示しているDBデータは
文字化けします。

専用サーバのphpMyAdminから
データを日本語の文字列に編集・更新したら、
phpMyAdmin内ではそのデータに関しては文字化けなく表示されますが、
サイト内ではそのデータは文字化けしてしまいます。

専用サーバ情報は下記の通りです。

【専用サーバ】
OS:CentOS 5
Apache 2.2.3
PHP5.1.6
DBサーバ:MySQL 5.0.77
アップしているファイルの文字コード:EUC

分かる方、ご回答、よろしくお願いいたします。

サーバはさくらインターネットを利用してます。
レンタルサーバから専用サーバに移転したのですが、
専用サーバではphpMyAdminで日本語データの文字化けが起きます。

専用サーバのphpMyAdminからDB作成の際、下記の設定で行い、

MySQLの文字セット UTF-8 Unicode (utf8)
MySQLの接続照合順序 utf8_unicode_ci
DB の照合順序 utf8_unicode_ci

レコードをINSERTする際、下記のように文字コードを指定し、
$sql=mb_convert_encoding($sql,"EUC-JP","EUC-JP");
execute_sql($con, $sql);

実行したら...続きを読む

Aベストアンサー

普通は、文字化け等で悩まなくてもいいように、HTMLの文字コード、PHPソースの文字コード、そしてDBの文字コードは一致させる事が求められます。
イレギュラーに文字コードをバラバラにするのであれば、文字コードをきちんと理解した対処をしましょう。

>レコードをINSERTする際、下記のように文字コードを指定し、
>$sql=mb_convert_encoding($sql,"EUC-JP","EUC-JP");
>execute_sql($con, $sql);

>サイト内で表示しているDBデータ(日本語)は文字化けしませんでした。

当然ですね、EUC-JPで保存してるのでとりだしたときもEUC-JPになります。
HTML(およびPHP)の文字コードとしては合っているので、結果的に文字化けしていないだけです。
保存時に一旦文字化けして、取り出し時に逆文字化けしているので、結果的に文字化けしていないように見える、と言えば判りやすいですかね。

ただ、
>実行したら、phpMyAdmin内で日本語データが文字化けしました。
これも当然です。
UTF-8のDBに対して、EUC-JPで保存しているのですから。
先の例で言えば、保存時に一旦文字化けしている結果です。

>phpMyAdminからデータを日本語の文字列に編集・更新したら、サイト内ではそのデータは文字化けしてしまいます。
これも当然です。
先の例で言えば、取り出し時に逆文字化けした結果です。

保存時には、#1、#2の方のいうようにUTF-8に変換して保存する必要があります。
$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");

そして取り出し時には、毎回、EUC-JPに変換して出力しなければなりません。
echo mb_convert_encoding($hoge['field1'],"EUC-JP","UTF-8");
echo mb_convert_encoding($hoge['field2'],"EUC-JP","UTF-8");
echo mb_convert_encoding($hoge['field3'],"EUC-JP","UTF-8");
このように面倒な事をしたくないために、イレギュラーな設計をしないのが普通です。

>$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");
>で実行してみましたが、別の変な文字に文字化けしました。
おそらく、クライアントの文字コードが正しく認識されていないのではないかと思います。
MySQLに接続直後に以下の関数を実行してください。
mysql_set_charset('utf8');
クライアントの文字コードをMySQLに対して通知する関数です。
環境によっては、"SET NAMES utf8"をクエリーとして発行する方法をとらなければならないかもしれません。


※もしかしたら、上記のすべてが以下の一行一発だけで解決するんじゃないかな、との期待ができなくもありません。
理屈の上ではあり得るかも、というレベルですが。
mysql_set_charset('euc-jp');

普通は、文字化け等で悩まなくてもいいように、HTMLの文字コード、PHPソースの文字コード、そしてDBの文字コードは一致させる事が求められます。
イレギュラーに文字コードをバラバラにするのであれば、文字コードをきちんと理解した対処をしましょう。

>レコードをINSERTする際、下記のように文字コードを指定し、
>$sql=mb_convert_encoding($sql,"EUC-JP","EUC-JP");
>execute_sql($con, $sql);

>サイト内で表示しているDBデータ(日本語)は文字化けしませんでした。

当然ですね、EUC-JPで保存してるの...続きを読む

QSELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか

SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか?
MYSQLサーバのバージョンは5.0.77です。

下記のように「*」を使用して指定テーブルの全カラムを表示する方法がありますが、
SELECT TableName.* FROM TableName

上記の逆で、指定テーブルの指定カラム以外の全カラムを一括指定って可能でしょうか?
例えば下記のような「^」みたいな、又は同等な書き方があれば良いなと思ってまして。
SELECT TableName.^ColumnName1 FROM TableName

ちなみに、下記のように一つ一つ表示したいカラムを指定する方法以外です。
SELECT TableName.ColumnName2 , TableName.ColumnName3 FROM TableName

よろしくお願いします。

Aベストアンサー

ない。
SQL文でそんなことをするより、メソッドとして作ればいいんじゃないですか。
だいたい、それ以外のカラムの数がわからないし、並びも不明だし。

#1に方と同じで
SELECT * from xxxx
なんてのは正気の人間は書きません。
カラムの数も位置も属性もわからないSQL文の結果をどうやって扱うのか。


人気Q&Aランキング