Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
MySQLでの日本語データの文字化けについて - PHPプロ!Q&A掲示板
[go: Go Back, main page]

<< 値を送りたいのですが・・・ 質問一覧 文字扱いの数値を数値に変換 >>

  • 0P
MySQLでの日本語データの文字化けについて

はじめまして、PHP・MySQLについて勉強を始めたばかりの初心者です。
今回、POSTを使いPHPからMySQlへデータ挿入を行っています。
SJIS設定では、MySQlへ日本語入力ができたのですがEUCJPで文字化けをしております。

・現在の環境
Apache/2.0.63(Win32) PHP/5.2.6 MySQL/5.0

・php.iniの設定、以下になります。
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encofing__translation = On
mbstring.detect_order = auto
mbstring.substitute_charecter = auto
mbstring.script_encoding = EUC-JP

・コマンドにて設定の確認。
mysql> show variables like "char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | ujis                       |
| character_set_connection | ujis                       |
| character_set_database   | ujis                       |
| character_set_results    | ujis                       |
| character_set_server     | ujis                       |
| character_set_system     | utf8                       |
| character_sets_dir       | MySQL\share\charasets      |
+--------------------------+----------------------------+

・my.iniの設定、以下になります。
[client]
default-character-set=ujis
[mysql]
default-character-set=ujis
[mysqld]
default-character-set=ujis
skip-character-set-client-handshake
init-connect=SET NAMES ujis 

  1. <?php
  2. $server = 'localhost:3306';
  3. $username = 'sample';
  4. $password = 'password';
  5. $db = mysql_connect($server$username$password)
  6.     or die("Couldn't connect to database");
  7. mysql_query("SET NAMES 'ujis'");
  8. $last_name = addslashes($_POST['last_name'])
  9. $first_name = addslashes($_POST['first_name'])
  10. $age = addslashes($_POST['age'])
  11. mysql_select_db('sample1db'$db);
  12. $query_ins = "INSERT INTO member (first_name,last_name,age) VALUES('$last_name','$first_name',$age)";
  13. $result = mysql_query($query_ins$db);
  14. $query_sel = 'SELECT * FROM member';
  15. $result = mysql_query($query_sel$db);
  16. ?>

参考書ではpearを使用していたのですが、私の環境では使用できずコードを変更してみました。
このコードでデータが入りますが、カタカナと漢字交じりのものでした。
どなたかご教授よろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。

QMySQLでの日本語データの文字化けについて kanecon  [09月10日 17時28分] 
┗参考になったRe:MySQLでの日本語データの文字化けについて NurseAngel  [09月11日 17時09分] 
  ┗Re:Re:MySQLでの日本語データの文字化けについて kanecon  [09月11日 17時47分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

Re:MySQLでの日本語データの文字化けについて

addslashesはセキュリティ対策になりませんので、mysql_real_escape_stringに変更しましょう。

・$_POSTの文字コードが不明です。
"set names ujis"は、「今からのデータはujisで送りますよ」という意味なので、
以後送るデータをmb_convert_encoding等で変換しなければ正しく保存されません。

set namesの文字コードは別に相手に合わせなければならないというわけではなく、
ここを"set names utf8"にして以後utf-8で送ればDBが勝手にujisに変換した上で保存してくれますし
検索した場合はujisで検索した上でutf-8にして送ってくれます。
まあ無用の混乱を避けるためにも同じにしておいた方が安全ですが。


・set namesはセキュリティホールになる可能性があるので、使用できるならmysql_set_charsetを使用しましょう。
#そもそもinit-connect=SET NAMES ujis なので"set names ujis"の意味がありませんが。


ちなみに変換の順番はmb_convert_encodingmysql_real_escape_stringです。

Re:Re:MySQLでの日本語データの文字化けについて

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

昨日の書込み後、「データ検索結果の表示」のコードを作成し実行してみたところ入力データは日本語で全て表示されていました。原因が分からずに、本当に悩んでおりましたが・・・

解決と言ってよいのでしょうか・・・つい先ほど参考書、巻末に「コマンドプロンプトでMySQLにログイン後、日本語入力ができない場合」とし記載がありました。コマンドが掲載されており、

mysql> set names cp932;

実行してみたところ、データベース内の文字化けが修正されました。
確認の為にPOSTから送信を試してみると、日本語データが表示されました。
($_POSTの文字コードはEUC-JPでした)

勉強を始めたばかり、何もかも参考書がお手本となっておりました。
addslashesの件など大変、参考になる貴重なご意見ありがとうございます。
値を送りたいのですが・・・ 質問一覧 文字扱いの数値を数値に変換