マンガでよめる痔のこと・薬のこと

サーバはさくらインターネットを利用してます。
レンタルサーバから専用サーバに移転したのですが、
専用サーバでは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

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

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

A 回答 (3件)

普通は、文字化け等で悩まなくてもいいように、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');

この回答への補足

ありがとうございます。
とても分かりやすかったです。非常に参考になりました。
これから試してみるつもりです。結果も報告いたします。
ところで、MySQLの文字セットを UTF-8 からEUC-JPに変更すれば
解決しますでしょうか?またそれは可能でしょうか?

補足日時:2010/04/01 13:09
    • good
    • 0
この回答へのお礼

MySQLの文字セットの問題でした。
ありがとうございました。

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

MySQLの文字セットが UTF-8 になっているのですから、


$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");
とすべきです。
ご確認下さい。

この回答への補足

ありがとうございます。
MySQLの文字セットを UTF-8 からEUC-JPに変更することは可能でしょうか?

補足日時:2010/04/01 13:08
    • good
    • 0

> $sql=mb_convert_encoding($sql,"EUC-JP","EUC-JP");



とりあえず、これは
$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");
と、脳内変換しました。

mb_internal_encoding() とか mb_language() は どうなってますか?

この回答への補足

ご回答、ありがとうございます。

$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");
で実行してみましたが、別の変な文字に文字化けしました。
phpMyAdminだけでなく、サイト内でも文字化けが起きました。

ドキュメントルート(/home/▲▲▲/www)
の直下に.htaccessファイルがあり、
中は下記のようになってます。

php_value include_path "/■■■/PEAR/"
php_flag log_errors 'On'
php_flag register_globals 'On'
php_value mbstring.language "Japanese"
php_value mbstring.internal_encoding "EUC-JP"
php_flag mbstring.encoding_translation On
php_value default_charset "EUC-JP"
php_value mbstring.http_input auto
php_value mbstring.http_output "EUC-JP"
php_value mbstring.substitute_character none

ドキュメントルート /home/▲▲▲/www
phpMyAdminのディレクトリ /home/phpmyadmin

となっています。

よろしくお願いいたします。

補足日時:2010/04/01 02:46
    • good
    • 0

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

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

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

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

Qphpmyadminで日本語データが文字化け

phpmyadminで日本語のデータだけ文字化けしてしまいます。

phpで作成された掲示板からデータをmysqlに投稿し、そのデータを再度掲示板で表示しています。

投稿・表示するphpファイルはutf8で、mysqlのmy.cnfは以下のようになっています。
---------------
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

character-set-server=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8
---------------

phpmyadmin(2.11.11)側は、MySQ の接続照合順序:utf8_unicode_ci にしています。

phpmyadminで文字化けしているデータをphpで見ると問題なく表示されてるのが不思議です。

どこが問題なのでしょうか。

phpmyadminで日本語のデータだけ文字化けしてしまいます。

phpで作成された掲示板からデータをmysqlに投稿し、そのデータを再度掲示板で表示しています。

投稿・表示するphpファイルはutf8で、mysqlのmy.cnfは以下のようになっています。
---------------
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

character-set-server=utf8

[mysqld_safe]
log-error=/var/log/mysql...続きを読む

Aベストアンサー

単にphpMyAdmin上の文字化けだけなら

$cfg['DefaultLang']
$cfg['DefaultConnectionCollation']
$cfg['DefaultCharset']

あたりの設定を調整してみてはいかがですか?

Qphpmyadmin 文字化け

phpmyadmin 文字化けを開きテーブルを見ると日本語が化けてしまいます。
php のプログラムからは読み書き、表記は正しくできます。

いろいろ調べ以下をやったのですがだめでした。

「MySQLの設定」
# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
#skip-character-set-client-handshake
※最終的にコメントアウト
[mysql]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
MySQLをリスタートする。
# /etc/rc.d/init.d/mysqld restart


「phpMyadminの設定」
# vi /var/www/phpmyadmin/config.inc.php
$cfg['DefaultLang'] = 'utf-8';
$cfg['DefaultConnectionCollation'] = 'utf8_general_ci';
$cfg['FilterLanguages'] = '';
$cfg['DefaultCharset'] = 'utf-8';
$cfg['AllowAnywhereRecoding'] = TRUE;

apache再起動


何か足りない点はありますでしょうか?

環境は以下です。

phpMyAdmin
•バージョン情報: 3.5.1 (最新版)

•サーバ: Localhost via UNIX socket
•ソフトウェア: MySQL
•ソフトウェアバージョン: 5.1.61 - Source distribution
•プロトコルバージョン: 10
•ユーザ: root@localhost
•サーバの文字セット: UTF-8 Unicode (utf8)

phpmyadmin 文字化けを開きテーブルを見ると日本語が化けてしまいます。
php のプログラムからは読み書き、表記は正しくできます。

いろいろ調べ以下をやったのですがだめでした。

「MySQLの設定」
# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
#skip-character-set-client-handshake
※最終的にコメントアウト...続きを読む

Aベストアンサー

とりあえず

(1)phpMyAdmin上で所定のテーブルの照合順序をutf8_unicode_ciあたりにしておく
(2)文字列の入っているカラムの照合順序を同様に調整する

登録させているデータがEUCならujis_japanese_ciとかになるかも・・・
sjis系は問題外なので省略

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Q「Duplicate entry '1' for key 'PRIMARY'」というエラー。

mysql> show fields from do;
+-----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| parent_id | int(11) | YES | | 0 | |
| data_time | bigint(20) | YES | | NULL | |
| text | text | YES | | NULL | |
+-----------+------------+------+-----+---------+----------------+
というテーブルに、
insert into do values (1,1,1,'kkk');
などと、SQL文を実行すると、
Duplicate entry '1' for key 'PRIMARY'
というエラーが出ます。
これはどういう意味のエラーなのでしょうか?

mysql> show fields from do;
+-----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| parent_id | int(11) | YES | | 0 | |
| data_time | bigint(20) | YES | | NULL | |
| text | text | YES | | ...続きを読む

Aベストアンサー

id というカラムに既に1という値が入ったレコードがあったりしませんか?
idカラムはプライマリキーに設定されているのでユニークな値を持たせる必要があります。
あと、idカラムはオートインクリメントが設定されているようなので、idカラムに値をあえて入れる必要は無いかもしれません。

Qサーバデータのエクスポートで文字化けする

「さくら」のレンタルサーバを利用しています
そのサーバのデータベースはMySql 5.1を使っているようですが
さくらが用意している管理ツール(phpMyadmin)を利用して
データをCSVデータとしてエクスポートしたいのですが
日本語が文字化けします
ダンプ表示には
(1)CSV
(2)MS Excel用のCSV
(3)・Excel 97-2003 XLS workbook
(4)Excel 2007 XLSX Workbook
等々の形式があるのですがいずれも文字化けします
一番下に文字コードを選択する項目があり
・non
・EUC
・SJIS
のいずれもやってみたのですが結果は文字化けしてしまいます
サーバ側の文字化けしないでエクスポートするためには
どのように設定すればよいのでしょうか
教えていただければ幸いです

Aベストアンサー

データーの格納先のフィールドはUNICODE格納などの指定がされてないのでは?日本語はそういう指定をしないと化けますよ。どのDBでも。

QJavaScriptde途中で、「exit」するには?

function kensaku(){
s_data = document.kaiin_form.input_name.value;

if(!s_data){ alert("キーワードを入れて下さい!"); }

if(s_data != dumy){ ...... }
for(i=st_no;i<=n;i++){
......省略.................;
.......省略................}
}

----------------------------------
3行目で表示されたアラートをOKで閉じても、4行目以下が実行されてしまいます。
3行目でexitするにはどうすれば良いでしょうか?

Aベストアンサー

>関数(kensaku())からは抜けられませんでした。
そうですね、勘違いしていました、f(^^;
すみません。
if(!s_data){
alert("キーワードを入れて下さい!");
return;
}
ですね。

QDBエラーの意味

フォームからDBにデータ挿入しようとすると

Column count doesn't match value count at row 1

というエラーが出てしまいます・・・どういう意味を持ったエラーなんでしょうか?

Aベストアンサー

カラム数と値の数が合わない、と言う事です。簡単な英語なので覚えましょう。
カラム数が4つにもかかわらず、
"INSERT INTO tablename VALUES (1,'hoge',3)"
とやった場合等に出るエラーだと思います。

Qphpのエラーについてです

mysql上のデータをphpでブラウザに表示するコードを書いています。
下記のプログラムを実行した所
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\xampplite\htdocs\shop\index.php on line 18
というようなエラーが表示されます。
本の通りに進めているので間違っていないはずなんですが・・
どこが成立していないのでしょうか???

<?php
mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db('mydb');
mysql_query('SET NAMES UTF8');

$recordSet = mysql_query('SELECT m.name, i.* FROM makers m, my_
items i WHERE m.id=i.maker_id ORDER BY id DESC');
?>

<table width="100%">
<tr>
<th scope="col">ID</th>
<th scope="col">メーカー</th>
<th scope="col">商品名</th>
<th scope="col">価格</th>
</tr>
<?php
while ($table = mysql_fetch_assoc($recordSet)) {
?>
<tr>
<td><?php print(htmlspecialchars($table['id'])); ?></tb>
<td><?php print(htmlspecialchars($table['name'])); ?></tb>
<td><?php print(htmlspecialchars($table['item'])); ?></tb>
<td><?php print(htmlspecialchars($table['price'])); ?></tb>
</tr>
<?php
}
?>
</table>

mysql上のデータをphpでブラウザに表示するコードを書いています。
下記のプログラムを実行した所
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\xampplite\htdocs\shop\index.php on line 18
というようなエラーが表示されます。
本の通りに進めているので間違っていないはずなんですが・・
どこが成立していないのでしょうか???

<?php
mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db('mydb');
mysql_query('SET NAMES UTF8');

...続きを読む

Aベストアンサー

『C:\xampplite\htdocs\index.php の第18行に誤りがあります。』
『mysql_fetch_assoc() は、第1パラメータがリソースであるべき』のエラーです。

18行目がどこかわからないが
『while ($table = mysql_fetch_assoc($recordSet)) {』多分これかな?

『$recordSet』がSQLの結果になっていないためエラーになってます。
原因は、いろいろ
1.DBにデータがない、
2.DBのフィールドとSELECT文が一致していない
3.接続先のDBを間違えている。
4.そもそもPHPでMYSQLが使えない(PHP.iniでロードしてない)
などなど、
「mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db('mydb');
mysql_query('SET NAMES UTF8');
$recordSet = mysql_query('SELECT m.name, i.* FROM makers m, my_

それぞれの関数の実行結果を確認するようにすれば、どこで原因があるのかわかると思います。
調べてみてください。

あと、「mysql_fetch_assoc() expects parameter 1 to be resource」で検索するとそれなりに情報がヒットしますよ
(英語も多いですが、そこは雰囲気で確認してみるべし)

『C:\xampplite\htdocs\index.php の第18行に誤りがあります。』
『mysql_fetch_assoc() は、第1パラメータがリソースであるべき』のエラーです。

18行目がどこかわからないが
『while ($table = mysql_fetch_assoc($recordSet)) {』多分これかな?

『$recordSet』がSQLの結果になっていないためエラーになってます。
原因は、いろいろ
1.DBにデータがない、
2.DBのフィールドとSELECT文が一致していない
3.接続先のDBを間違えている。
4.そもそもPHPでMYSQLが使えない(PHP.ini...続きを読む

QPermission denied in

PHPを実行するとWarning: fopen failed to open stream Permission denied inと
表示されてしまいます。
インターネットを使い、調べてはいますが、
上記のように表示してしまいます。
ファイルです。パーミッションは606にしました。

このWarningを表示させないようにするには、どのようにすれば
良いのか教えて頂けると嬉しいです。

Aベストアンサー

あとは
> PHPを実行するユーザーとそのグループはどうなってますか?

PHPを直接コマンドラインから実行するのなら、ユーザーはあなたですが、httpサーバーでモジュールやCGIとして実行するなら別の権限(nobodyとか)になっていると思います。

あとは
ディレクトリのパーミッションを 707 にする
ディレクトリとファイルのオーナーをPHPを実行するユーザーにする
とかでしょうか。

QphpMyAdminの初期設定のトラブルについて

新しい(専用)サーバーです。
phpMyAdminをFTPで設置しました。

config.inc.phpに、必要な情報を加えたはずなのですが、実際に、アクセスすると、以下のエラーが出て、ログインできません。


#1045 - Access denied for user: 'root@localhost' (Using password: YES)

事前に、サーバー側に別途何かしなければ、いけないのでしょうか?それとも、config.inc.phpに設定の誤りがあるのでしょうか?

何が問題で、どのようにすればよいのかが、わかりません。
どなたか、ご指南頂けると助かります。

Aベストアンサー

ちょっと補足しますが。
phpMyAdminのデフォルト設定は
user:root
password:なし
auth_type:config

デフォルトの設定だと誰でも簡単にログインできますので、一度接続したら新規ユーザーとパスワードを設定し、rootを削除。(rootのパスワードを設定でもいいです)

config.incのauth_typeを”http”にし、userとpassword欄を空欄にすれば、phpMyAdminに接続する際パスワード入力画面が出てきますので、新規作成したユーザーとパスワードでログインできます。
そうすると不正アクセスも防げます。


人気Q&Aランキング