文字コード確認設定

文字コードを確認するSQL文「SHOW VARIABLES LIKE 'char%';」

MySQL4.1以降はサーバとは別にクライアントの文字コードが設定されている。
クライアント、サーバ間で違う文字コードがセットされていると、一度ucs2変換を通る。
よって、クライアント、サーバ間で違う文字コードを指定することとなり文字化けが起こる可能性がある。

PHPはmy.cnfで[mysql]、[client]を設定しようがクライアントの文字コードはビルド時に指定されたキャラクタセット(通常latin1)。

my.cnfの設定

[mysql]

default-character-set = utf8

[mysqld]

default-character-set = utf8

mysql> SHOW VARIABLES LIKE 'char%';

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_results | utf8 |

| character_set_server | utf8 |


mysql> SHOW VARIABLES LIKE 'char%';

| character_set_client | latin1 |

| character_set_connection | latin1 |

| character_set_database | utf8 |

| character_set_results | latin1 |

| character_set_server | utf8 |

mysql> SET NAMES ujis;

mysql> SHOW VARIABLES LIKE 'char%';

| character_set_client | ujis |

| character_set_connection | ujis |

| character_set_database | utf8 |

| character_set_results | ujis |

| character_set_server | utf8 |

MySQLの4.1.15以降、5.0.13以降で「skip-character-set-client-handshake」というオプションが追加された。
クライアントからリクエストがあった場合、クライアントの文字コードをサーバの文字コードと同じものをセットする。

[mysql]

default-character-set = binary

[mysqld]

default-character-set = utf8

skip-character-set-client-handshake


mysql> SHOW VARIABLES LIKE 'char%';

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_results | utf8 |

| character_set_server | utf8 |

ただし、「skip-character-set-client-handshake」は「character_set_server」の値を参照するので注意。

mysql> CREATE DATABASE sample CHARACTER SET ujis;

mysql> USE sample;

mysql> SHOW VARIABLES LIKE 'char%';

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | ujis |

| character_set_results | utf8 |

| character_set_server | utf8 |


mysqldumpについて。
mysqldumpはデフォルトでutf8の文字コードがセットされている。

[mysql]

default-character-set = sjis

[mysqld]

default-character-set = utf8

[mysqldump]

default-character-set = binary


文字セットに「binary」をセットすると「character_set_database」を無変換で出力してくれる。

C:\>mysql -u root sample;

mysql> SHOW VARIABLES LIKE 'char%';

| character_set_client | sjis |

| character_set_connection | sjis |

| character_set_database | ujis |

| character_set_results | sjis |

| character_set_server | utf8 |

mysql> \q

C:\>mysqldump -u root sample > dump.sql


上記の場合は出力ファイルの文字コードはEUC-JP。

[mysql]

default-character-set = sjis

[mysqld]

default-character-set = utf8

skip-character-set-client-handshake

[mysqldump]

default-character-set = binary


「skip-character-set-client-handshake」をセットすると…

C:\>mysql -u root sample;

mysql> SHOW VARIABLES LIKE 'char%';

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | ujis |

| character_set_results | utf8 |

| character_set_server | utf8 |