XAMPP/MySQLの文字化けについて ???? | SENNOKOTSU

XAMPP/MySQLの文字化けについて ????

XAMPP はローカルテスト用サーバー構築にはとっても手っ取り早いインストールパッケージですが、これ…普通にインストールして利用しようとすると、まず、SQL文、データのインポート等でデータを流し込む際に、日本語が文字化け"?????"ハテナ(クエスチョンマーク)になってしまう。(´;へ;`)

以前はEUCってセットが標準的だったのだが、Unicodeも整備されてきたので、最近は専らUTFにて構築することが多くなった。
この文字化けって… 実際、不具合とかそういうものではないのだが、結構悩まされてる方も多いように思う。

で、問題の文字化け解消方法につき、色々と書かれたサイトが見受けられるのだが…

とりあえず、今まではこれらのサーバーセットをインストールした後、下記のサイトにある方法でこれらの文字化けを回避していた。
http://cl.pocari.org/2006-06-17-1.html
要するに、-> の場所にある phpMyAdmin/libraries/database_interface.lib.php <-のファイルを編集するという方法。
4.1からの分岐処理部分をごっそり消してしまうという方法ですね。

823~877までの行をごっそりコメントアウトしてしまう方法。 ダウンって部分。
※XAMPPのパッケージバージョンは当方の環境では1.6.3a

*****************************************************************

// If $lang is defined and we are on MySQL >= 4.1.x,
// we auto-switch the lang to its UTF-8 version (if it exists and user
// didn't force language)
if ( !empty($GLOBALS['lang'])
&& (substr($GLOBALS['lang'], -5) != 'utf-8')
&& !isset($GLOBALS['cfg']['Lang']) ) {
$lang_utf_8_version =
substr($GLOBALS['lang'], 0, strpos($GLOBALS['lang'], '-'))
. '-utf-8';
if (!empty($GLOBALS['available_languages'][$lang_utf_8_version])) {
$GLOBALS['lang'] = $lang_utf_8_version;
$GLOBALS['charset'] = 'utf-8';
define('PMA_LANG_RELOAD', 1);
}
}

// and we remove the non-UTF-8 choices to avoid confusion
if (!defined('PMA_REMOVED_NON_UTF_8')) {
foreach ( $GLOBALS['available_languages'] as $each_lang => $dummy ) {
if ( substr($each_lang, -5) != 'utf-8' ) {
unset( $GLOBALS['available_languages'][$each_lang] );
}
}
define('PMA_REMOVED_NON_UTF_8', 1);
}

$mysql_charset = $GLOBALS['mysql_charset_map'][$GLOBALS['charset']];
if ( $is_controluser
|| empty($GLOBALS['collation_connection'])
|| (strpos($GLOBALS['collation_connection'], '_')
? substr($GLOBALS['collation_connection'], 0, strpos($GLOBALS['collation_connection'], '_'))
: $GLOBALS['collation_connection']) == $mysql_charset) {

PMA_DBI_query('SET NAMES ' . $mysql_charset . ';', $link,
PMA_DBI_QUERY_STORE);
} else {
PMA_DBI_query('SET CHARACTER SET ' . $mysql_charset . ';', $link,
PMA_DBI_QUERY_STORE);
}
if (!empty($GLOBALS['collation_connection'])) {
PMA_DBI_query('SET collation_connection = \'' . $GLOBALS['collation_connection'] . '\';',
$link, PMA_DBI_QUERY_STORE);
}
if (!$is_controluser) {
$GLOBALS['collation_connection'] = PMA_DBI_get_variable('collation_connection',
PMA_DBI_GETVAR_SESSION, $link);
$GLOBALS['charset_connection'] = PMA_DBI_get_variable('character_set_connection',
PMA_DBI_GETVAR_SESSION, $link);
}

// Add some field types to the list, this needs to be done once per session!
if (!in_array('BINARY', $GLOBALS['cfg']['ColumnTypes']))
$GLOBALS['cfg']['ColumnTypes'][] = 'BINARY';
if (!in_array('VARBINARY', $GLOBALS['cfg']['ColumnTypes']))
$GLOBALS['cfg']['ColumnTypes'][] = 'VARBINARY';


*****************************************************************

しかーし!他のサイトもよく読んでみると照合順序を変更するだとか…って良く見かけるんですが、これ他の設定ファイル類を開いていじってみても、なかなか解決しないことが多い。

っていうか…ちゃんとみてませんでした( ´・ω・`)



MySQL の接続照合順序の変更ではなく、DBを作成するとき重要に、データベース自身の「照会順序」のとこを「utf8_general_ci」に設定すれば問題解決です。

個別のDB自身でそれぞれの照合順序を持つということですね…(´-ω-`)
マニュアルでDB作成すれば、そういった部分にも気づくはずなのですが、便利なツールを使ってしまうとついつい見落としてしまいます。

そして、mysql の my( .cnf )ファイルを以下のように編集することでばっちりUTFで動作しました。

※ xamppの場合などは xampp/mysql/bin にある my.ini

===============================================
[mysqld]
port= 3306
socket = "C:/xampp/mysql/mysql.sock"
basedir = "C:/xampp/mysql"
tmpdir = "C:/xampp/tmp"
datadir = "C:/xampp/mysql/data"
pid_file = "mysql.pid"
# enable-named-pipe
key_buffer = 16M
max_allowed_packet = 1M
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log_error = "mysql_error.log"

character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake

===============================================


もしくは


character-set-server = latin1
collation-server = latin1_general_ci

矢印

character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake




*********************************** バージョンが違う場合ではこんな追記を

[client]
default-character-set = utf8

[mysqld]
skip-character-set-client-handshake
default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8