文字コードの多様化とインターネットやクライアント-サーバーなどの分散環境の普及によって,文字化けトラブルの頻度が飛躍的に拡大した。特に Webシステムでは,WebブラウザとWebサーバー,プログラム(スクリプト)言語,そしてデータベースと文字化けが発生する要因が数多く存在する。 Webサーバー側の文字化けは,他のコラムにお任せすることとして,今回はMySQLの文字化けに関して解説する。
文字化けの仕組み
文字化けは開発者にとって悩みの種である。しかし,文字化けの仕組みを少しでも知っていれば,意外と簡単に解決できるものだ。このコラムで,ぜひその知識を学んでほしい。
MySQL 4.1の変更点
さて,MySQLにおいては,バージョン4.1のリリースを境に文字化けが起きることが非常に多くなった。では,バージョン4.1は,それ以前のバージョンと何が変わったのだろうか。そこに文字化けを解決するヒントがある。
表1●MySQL4.1の主な変更点
内容 | 文字化けとの関連 | |
---|---|---|
新機能 | サブクエリーのサポート | |
Unicode (utf8 および ucs2)サポート |
|
|
文字コードの自動変換機能の追加 |
|
|
変更点 | カラム,テーブル,およびデータベースごとにキャラクタセットを定義 |
|
カラム(フィールド)の定義がバイト単位から文字単位に変更 | ||
timestamp 型の表示フォーマットが変更 | ||
パスワードの保存形式が変更 |
上記の中で,文字コードに関係する項目が3つある。これらを順番に解説する。
文字コードの増加(Unicodeのサポート)
MySQL 4.0では,2種類の日本語文字コードしかサポートしていなかった。しかし,MySQL 4.1からUnicodeが追加され,大きく分類すると3種類の文字コードが使用可能になった。
表2●MySQLのサポートする日本語文字コード
シフトJIS | EUC-JP | Unicode | |
---|---|---|---|
4.0 | sjis | ujis | |
4.1 | sjis / cp932 | ujis | utf8/ ucs2 |
5.0 | sjis / cp932 | ujis /eucjpms | utf8/ ucs2 |
つまり,MySQL4.0では,2種類の文字コードしかないので,文字化けが発生すれば,もう一方の文字コードで試せばよかった。しかし,MySQL5.0では,6種類の文字コードがあるため,文字化けが発生する機会が増えてしまった。
文字コードの定義
MySQL 4.0では,サーバー全体で文字コードの定義を行った。しかし,MySQL 4.1では,カラム(フィールド),テーブル,データベース毎に文字コードを設定可能になった。
その関連として,カラムの定義で文字列型に設定する場合,char(X)にて指定する数値がバイト数ではなく文字数に変更されたのだ。そのため,char(10)は,文字コードによって10バイト,20バイト,30バイトと物理的なバイト数が異なるようになった。