MySQL

  • 「Detailed Configuration」を選択した場合

インストーラから「next」を押し続けるMySQL Server Instance Configurationで「Detailed Configuration」を選択。色々と選択肢が出てくるがそのままNextを押し続ける。「Please select the default character set」が出てきたところで「Manual Selected Default Character Set/Collation」にチェックをし、「utf8」を選択してNext。rootユーザーのパスもローカル環境オンリーなのでrootにしました。以上でインストール完了
インストール完了したらコマンドプロンプトを立ち上げて
mysql -u root -p」でパスワードを要求されるので「root」

「status;」で

Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8

「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

を確認。次に確認用のテーブルを作成する。「show databases;」で既存のデータベースを確認。おそらく「test」がデフォルトであるので

「show databases;」
「use test;」
「create table debug(name varchar(20), age int);」
「insert into debug values('Taro', 20);」

確認で「select * from debug」 次いで 「insert into debug values('テスト太郎', 30);」おそらくここでコマンドプロンプトからエラーが帰ってきたかと思います。とりあえずスルーしてPHPからDBを操作してみることにします。

<?php
//1DB接続
$database = mysql_connect("localhost", "root", "root");
($database)?print"DbConnect_OK":print"DbConnect_NO";
print "<hr>";

//2DB選択
$rs = mysql_select_db("test", $database);
($rs)?print"DbSelect_OK":print"DbSelect_NO";
print "<hr>";

//3データ取得
$sqlstr = "select * from debug";
$rs = mysql_query($sqlstr, $database);
while($rows = mysql_fetch_assoc($rs)){
	$items[] = $rows;
}
print "<pre>;";
print_r($items);
print "</pre>;";
?>

もし上記?の接続スクリプトmysql_connect自体がエラーと出たら大体はlibmysql.dllがないのではないかと思います。php.iniで extension=php_mysql.dll extension=php_mysqli.dllのコメントアウトを解除したにも関わらずphpinfoにmysqlに関する記述が出現しない事でもそれを確認できます。解決策はphp5フォルダ直下のlibmysql.dllをsystem32フォルダ内にコピペしてapachemysqlの再起動。phpinfoにmysqlの項目が出現し、上記のスクリプトも問題なく通るはずです。

★ファイルの文字コードは(EUC-JP)

以上のコードで確認をします。とりあえず問題なくデータが帰ってくると思います。次いで新規データをインサートします。

//4データのInsert
$sqlstr = "Insert into debug values('Jiro', 15);";
$rs = mysql_query($sqlstr, $database);
($rs)?print"DbUpdate_OK":print"DbUpdate_NO";
print "&lt;hr&gt;";

コードの並びは1243とします。つまり

<?php
//1DB接続
$database = mysql_connect("localhost", "root", "root");
($database)?print"DbConnect_OK":print"DbConnect_NO";
print "<hr>";

//2DB選択
$rs = mysql_select_db("test", $database);
($rs)?print"DbSelect_OK":print"DbSelect_NO";
print "<hr>";

//4データのInsert
$sqlstr = "Insert into debug values('Jiro', 15);";
$rs = mysql_query($sqlstr, $database);
($rs)?print"DbUpdate_OK":print"DbUpdate_NO";
print "<hr>";

//3データ取得
$sqlstr = "select * from debug";
$rs = mysql_query($sqlstr, $database);
while($rows = mysql_fetch_assoc($rs)){
	$items[] = $rows;
}
print "<pre>"
print_r($items);
print "</pre>";
?>

データは問題なく返ってくると思います。コマンドプロンプト側でも確認して下さい。ついで4を「データのUPDATE」に変更します。

//4データのUPDATE
$sqlstr = "update debug set name='デバッグな人Jiro' where age=15";
$rs = mysql_query($sqlstr, $database);
($rs)?print"DbUpdate_OK":print"DbUpdate_NO";
print "<hr>";

並びは1243です。ブラウザの文字コードを「表示」→「エンコード」で「日本語(EUC)」が選択してある状態で実行します。するとブラウザ側の結果は文字化けなしで返ってくると思います。ただしコマンドプロンプト側で「select * from debug;」を実行すると日本語を入れた箇所は文字化けしているとおもいます。次いで「update debug set name='デバッグな人Jiro' where age=15;」をコマンドプロンプトで実行して下さい。エラーが返ってくると思います。次いでPHPのコードに

//5show variables;
$sqlstr = "show variables like 'char%';";
$rs = mysql_query($sqlstr, $database);
while($rows = mysql_fetch_assoc($rs)){
	$variables[] = $rows;
}
print "<pre>";
print_r($variables);
print "</pre>";

を加えます。15243ですが、念のため4はコメントアウトします。返ってきたデータをまとめると、

character_set_client latin1
character_set_connection latin1
character_set_database utf8
character_set_filesystem binary
character_set_results latin1
character_set_server utf8
character_set_system utf8

となっていると思います。コマンドプロンプト側でもう一度「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

となっていると思います。なぜこうなるのかは詳しくは知りませんが検索してみた感じではMySQLの仕様なのではないかと思います。次いで以下を追加します。

//6SET_NAMES
$sqlstr = "set names 'utf8';";
$rs = mysql_query($sqlstr, $database);
($rs)?print"DbSetnames_OK":print"DbSetnames_NO";
print "<hr>";

並びは165243です。4はコメントアウトしたまま。今度はブラウザ側とコマンドプロンプト側も

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

となっているはずです。ですがブラウザの文字コードEUCであっても日本語部分は文字化けが
生じたと思います。とりあえずデータを復帰します。

//4データのUpdate
$sqlstr = "update debug set name='Jiro' where age=15";
$rs = mysql_query($sqlstr, $database);
($rs)?print"DbUpdate_OK":print"DbUpdate_NO";
print "<hr>";

次に日本語で試します

//4データのUpdate
$sqlstr = "update debug set name='Jiroです' where age=15";
$rs = mysql_query($sqlstr, $database);
($rs)?print"DbUpdate_OK":print"DbUpdate_NO";
print "<hr>";

nameに日本語が入っていると"DbUpdate_NO"が返ってきてDBをupdateできなかった事がわかります。

//4データのUpdate
$sqlstr = "update debug set name='Jiroです' where age=15";
$sqlstr = mb_convert_encoding($sqlstr, 'utf8', 'EUC-JP');
$rs = mysql_query($sqlstr, $database);
($rs)?print"DbUpdate_OK":print"DbUpdate_NO";
print "<hr>";

今度は文字コードを変換してためしてみます。updateしたらブラウザの文字コードEUCであることを確認して見てみます。すると文字化けはありますがデータのupdateには成功した様子。4はコメントアウトして3を以下に書き換えます。文字化け箇所のデータの文字コード変換をしています。

//3データ取得
$sqlstr = "select * from debug";
$rs = mysql_query($sqlstr, $database);
while($rows = mysql_fetch_assoc($rs)){
	$items[] = $rows;
}
$items[1]['name'] = mb_convert_encoding($items[1]['name'], 'EUC-JP', 'utf8');
print "<pre>";
print_r($items);
print "</pre>";

今度は文字化けなしで表示できたと思います。(ブラウザはEUC)コマンドプロンプトはどうでしょう。文字化けしていると思います。コマンドプロンプトのプロパティを見てみると文字コードがShift-Jisであることがわかります。つまりブラウザでやったのように文字コード変換ができれば問題なく見れるということになります。これはMYSQLの設定ファイルmy.iniを書き換えることで解決できます。

[client]
default-character-set=sjis
host=localhost
user=root
password=root
port=3306

[mysql]
set-variable=no-beep
default-character-set=sjis
#default-character-set=utf8

インストール時にutf8に設定したのでその部分をコメントアウトして[client]と[mysql]を上記のように設定します。

  • 「set-variable=no-beep」はビープ音を消す設定です。けっこうドキッとする音なので。
  • 「host=localhost」「user=root」「password=root」で「mysql -u root -p」のコマンドを打つ必要がなくなり「mysql」だけでよいことになります。

MYSQLを再起動し、コマンドプロンプトも念のため立ち上げ直してデータを確認。
今度は日本語もOKなはずです。
まとめとしては

    1. MYSQL文字コードを「utf8」に統一した。
    2. PHP側でDBと絡むときは接続確立後に「set names 'utf8'」のクエリを発行し環境の統一をした。
    3. DBから取得したデータは「utf8」から「希望の文字コード」に変換した
    4. DBへインサートするデータは「utf8」に変換した
    5. WindowsにインストールしたMYSQLコマンドプロンプトで操作するための文字コード設定をsjisにした

ということでしょうか。

phpMyAdminはまた今度