- 2005-03-01 (火)
- MySQL
自宅サーバにMySQL4.1を導入するうえで調べた日本語(マルチバイトコード)環境の設定方法をまとめてみました。サーバ環境は RedHatLinux 7.2J (glibc2.2.4)、インストールしたMySQLパッケージは Linux x86 RPM package version: 4.1.10-0 です。※MySQL4.1のマルチバイト環境に関する総合的な情報は別エントリ「MySQL 4.1 日本語環境での使用時の注意点/関連情報まとめ」を参照の事。なので、ここでは単純に「日本語環境を構築するには何をどう設定すればよいのか... HOW TO 情報」に限定しています。
目次
- 1) 基礎知識
- 2) キャラクタセットの設定方法には幾つかの方法がある
- 2.1) 設定方法1: ユーザ設定ファイル my.cnf にてデフォルト設定を定義する
- 2.2) 設定方法2: SQL文 'SET NAMES x' にてコネクション確立毎に指定を行う
- 2.3) 設定方法3: オプション引数 --default-character-set=x による指定
- 2.4) 設定方法4: Clientアプリ毎に異なる独自設定方法にて指定
- 3) 現在のキャラクタセット設定の確認方法
- 4)COLLATION 設定の確認方法
※情報源/参照サイト&文献
日本MySQLユーザ会FAQページ (Wiki)
MySQL.com の MySQL Documentation
実践MySQL4 - MySQL4の標準機能を活用した開発とその応用 - 村上 毅、他共著
1) 基礎知識
MySQL version 4.1 から、サーバ (mysqld) とクライアント(mysql,perl,PHP,etc) にてそれぞれ異なるキャラクタセット(文字コード)が設定可能になっています。従って、サーバ&クライアント共に、一貫した1つのキャラクタセットにて動作させたい場合はサーバ、クライアントそれぞれに対して設定を施してあげる必要があります。※ソースコードからインストールする場合に限り、configureオプションにて一括でデフォルトキャラクタセットを指定する事が可能なようです。しかし、RPMパッケージからのインストールの場合は、既にデフォルトキャラクタセット = latin1 にて構築済みなので、下記設定を施す必要があります。
2) キャラクタセットの設定方法には幾つかの方法がある
- ユーザ設定ファイル my.cnf にてデフォルト設定を定義する
- SQL文 'SET NAMES x' にてコネクション確立毎に指定を行う
- mysql,mysqldump 等の標準Clientアプリ利用時... オプション引数 --default-character-set=x による指定
- PerlやPHP等のその他Clientアプリ利用時... Clientアプリ毎に異なる独自設定方法にて指定
恒常的な設定を施すのが一番最初の「my.cnfによる設定定義」です。残りの3つはトランザクション毎/コネクション毎に設定する事で柔軟な挙動制御が可能になる方法です。以下、順を追ってそれぞれの方法について説明していきます。
2.1) 設定方法1: ユーザ設定ファイル my.cnf にてデフォルト設定を定義する
MySQL.comにて入手可能なバイナリパッケージ (RPM等) はコンパイル時のデフォルトキャラクタセットが latin1 になっているので、このデフォルト設定を日本語キャラクタセットにする為に my.cnf に記述追加する必要があります。my.cnf に関する詳細情報はこのDocumentationを参照してもらうとして、「日本語環境として使う」のに必要な最小限設定にするには /etc/my.cnf を以下のような内容で作成します:
/etc/my.cnf 記述内容例
# サーバ設定 [mysqld] default-character-set=ujis # クライアントアプリ (Perl,PHP,etc) 使用時設定 # 注 : ここで設定した上でさらにアプリ側での設定追記も必要 (例) Perl DBI # mysql, mysqldump等 (shell client) に対してもここでの設定は有効 [client] default-character-set=ujis # mysql (標準client) 使用時設定 # mysql (標準client) に対して [client] での設定を上書き [mysql] default-character-set=ujis # mysqldump 使用時設定 # mysqldump に対して [client] での設定を上書き [mysqldump] default-character-set=ujis
各種設定の意味はコメントで把握してもらうとして、要は mysqld / mysqldump / client / mysql グループすべてに対して統一のキャラクタセットを指定しておけばOKって事です。ここで統一しておけば、MySQL内部での不要な文字コード自動変換処理がかかる事は無くなります。で、注意すべきは [client] グループの設定。PerlやPHP使用に必要な設定はこの my.cnf での設定だけがすべてではありません。ここで設定した上で、各クライアント側インターフェースの設定にて、
/etc/my.cnf の設定を読み込む&利用する
指定を施す必要があります(後述)。
※その他関連情報: 日本MySQLユーザ会FAQ「日本語環境の設定」
MySQL 4.1.15 以降の場合のラクチン設定方法 (2006/05/06追記)
サーバ・クライアントすべてに対して統一のキャラクタセットを指定する為のラクチンな設定方法が v4.1.15 にて導入された模様です。上記と同じ挙動を指定するには、以下の様に skip-character-set-client-handshake オプションを mysqld に対してつけてあげればOKです。
/etc/my.cnf 記述内容例
#サーバ設定 [mysqld] default-character-set=ujis skip-character-set-client-handshake
これだけで client / mysql / mysqldump 等のクライアント側もすべて ujis 設定として動作します。まぁ便利。※コメント欄にて教えてくれた tokuhirom さんありがとうです♪ (反映遅くなっちゃいました^^;)
※関連情報
MySQL 5.1 Reference Manual - mysqld Command Options
MySQL 4.1 Reference Manual - Changes in release (13, October 2005)
川o・-・)<2nd life - MySQL 文字コードの自動変換を回避するオプション
2.2) 設定方法2: SQL文 'SET NAMES x' にてコネクション確立毎に指定を行う
任意のタイミングで以下のSQL文(というかコマンド文)を発行する事により、クライアント側のキャラクタセットを変更することが出来ます :
SET NAMES 'x';
※日本語環境の場合: x = sjis / ujis / utf8 のいずれかを指定(ujis はEUC-JPの事)
MySQL Documentation の 10.3.6 Connection Character Sets and Collations の章では、この 'SET NAMES x' コマンドの他にもうひとつ 'SET CHARACTER SET x' コマンドについても記述がありますが、章全体を読む限り、より確実なのは 'SET NAMES x' コマンドの方のようです(これら2つのコマンドの効果範囲/違いについてはここでは省略)。※同資料の日本語訳ページだと 'SET CHARACTER SET x' を使え、といった意図の文章になっている事に気づく。純粋な文章翻訳では無いあたりちょっと疑問です... 原文の方だとより確実(効果範囲が広い)のは 'SET NAMES x' だとしています。
続き
Comments:8
- espio999 2005-05-16 (月) 20:53
-
IIS + mySQLでXoops環境を構築していたのですが、中途半端な文字化けに悩んでいました。こういうことだったんですね!設定変更したら、文字化けも解消されました。
- bashi 2005-05-17 (火) 10:06
-
>espio999さん
うす。お役に立てて幸いですー。 - あるプログラマ 2005-07-07 (木) 19:03
-
ああ、それでもやっぱり化けるのだ。(笑
っていうか、もう笑うしかないだろ。だって、朝からずっと、web漁っているのだから・・・・
- よしとも 2006-02-10 (金) 13:48
-
あ、どうもたすかりましたー。
ありがとうございますー。 - bashi 2006-02-13 (月) 23:29
-
はーい。お役に立てて嬉しいですー。
- kitty 2007-04-14 (土) 15:51
-
文章がわかりやすくてやっと理解できました。今度はJDBCドライバ使ったらまたそこでエンコード問題も出てくるんだな げげ
- bashi 2007-06-23 (土) 17:34
-
> kittyさん
コメントありがとうございます。
困りはてたら 'SET NAMES x' でとりあえず回避する方向で。がんばってください。 - まさ 2007-07-23 (月) 23:14
-
/etc/my.cnf の設定を読み込む方法ってどうするのでしょうか。