- 2005-03-06 (日)
- MySQL
MySQL version 4.1 において、日本語キャラクタセット(およびその他マルチバイトキャラクタセット)での使用を前提としてしたセットアップ/環境構築を行う際に知っておくべき情報や、知っておくと「なんでそんな挙動?うきぃ!」と錯乱せずに済むかもしれない情報などなどをまとめてみました。
※情報源/参照サイト&文献
日本MySQLユーザ会FAQページ (Wiki)
→有用情報満載のサイトです。4.0からの移行時の注意点等の情報も有。お勧め♪
MySQL.com の MySQL Documentation
実践MySQL4 - MySQL4の標準機能を活用した開発とその応用 - 村上 毅、他共著
1) MySQLサーバとクライアントでそれぞれ異なるキャラクタセット (文字コード) を設定可能
以前までのバージョンではクライアント側のキャラクタセットは自動的にサーバと同じものが設定されていたのに対し、version 4.1 からはサーバ、クライアントそれぞれでキャラクタセットを指定する必要があります。指定できるタイミング/指定方法等などの How To 情報については「MySQL 4.1 日本語環境設定方法」ページにてまとめてあるのでそちらを参照してください。で、デフォルトのキャラクタセット設定なんですが、MySQL コンパイル時の configure オプションにて指定可能なようです。対して、MySQL.comにて入手可能なバイナリパッケージ (RPM等) を使用する場合、デフォルトキャラクタセットは latin1 で既にコンパイル済みだという点に注意してください = インストール後に何らかの方法でキャラクタセット設定を施さないと正しく日本語が扱えません。設定方法は前述の「MySQL 4.1 日本語環境設定方法」を参照の事。
※その他参考情報:
mysql コマンドでは大丈夫なのに、PHP,perl,accessなどで文字が ? に化けるのは?
2) 文字列の自動コード変換機能
サーバとクライアント間でキャラクタセットが異なる場合は、MySQLサーバにて文字列のコード変換処理が自動実行されます。その際、sjis -> latin1 等、変換不可能な文字はすべて ? に置換されてしまいます。また、日本語やその他マルチバイト系のキャラクタセット間の変換の場合は、必ず UTF8 を介して変換される点にも注意が必要かと。例) Shift_JIS → EUC-JP への置換処理の実際は sjis -> utf8 -> ujis の2段置換処理がMySQLサーバ内部で行われる。utf8とその他キャラクタセットのマッピングが MySQL独自のものである為、ここで文字化け率が無駄にUPしてしまいます。このような余計なコード変換処理を避けるためにも、
サーバとクライアントのキャラクタセットは常に同じ設定に合わせておく
事が重要だと思われます。
※その他参考情報:
version 4.1 以上の文字コード変換機能とうまくつきあうには?
mysqldumpはデフォルトで UTF8 に自動変換される:mysqldump の仕様変更の弊害
3) COLLATIONについて
MySQLでは文字のソート順/並び順の定義(=COLLATION)が、各キャラクタセット(文字コード)毎に1つまたは複数存在します。たとえば キャラクタセット = latin1 だと
- latin1_general_ci
- latin1_swedish_ci
- latin1_spanish_ci
等、微妙な文字ソート順の違いによって複数の COLLATION が定義されています。で、MySQLサーバまたはMySQLクライアントにて使用するキャラクタセットを指定する度に、それらキャラクタセットごとに定義されている「デフォルト COLLATION」が自動的に設定され、order by はこのデフォルト COLLATION に準拠したソート順になります。で、日本語キャラクタセット(ujis/sjis)の場合、使用可能な COLLATION がデフォルトの「*_japanese_ci」と、バイナリソートの「*_bin」の2種類しか存在していない為、
COLLATION 設定はデフォルトのままで特に気にする必要なし
だと思われます。UTF8については... 未調査です(デフォルトの *_general_ci で問題なく動作している風)。肝心な UTF8 の調査が途中で面倒くさくなってやんの(汗
4) データベース, テーブル毎に異なるキャラクタセットを設定可能
以前までのバージョンでは、1つの mysqlサーバ (mysqld) に対して1つのキャラクタセット(文字コード)のみ設定可能だったのに対し、 version 4.1 からは データベース、テーブル、フィールド (カラム) ごとにそれぞれキャラクタセットを設定する事が可能だそうです。簡単に設定方法を列挙しておきます:
- CREATE文でのキャラクタセットの設定方法:
CREATE DATABASE hoge CHARACTER SET x
CREATE TABLE fuga ( ... ) CHARACTER SET x
CREATE TABLE fuga ( hehe CHAR(20) CHARACTER SET x , ... )
* x = sjis / ujis / utf8 のいずれかを指定 (日本語の場合)
*
設定可能なキャラクタセット一覧表示SQLコマンド : 'SHOW CHARACTER SET'
- 設定したキャラクタセットの確認方法
SHOW CREATE DATABASE hoge
SHOW CREATE TABLE fuga
※関連情報: データベース名、テーブル名、フィールド名に日本語は使える?
いや使わないでおくでしょ普通(汗
- Newer: Movable Type + MySQL 4.1 を組み合わせると日本語が文字化けする不具合/障害の解決方法
- Older: とある企業のシステム開発部に属する身として eXtreme Programming を業務や案件に適応する際の課題点/問題点