Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
今まで長々とメタデータに日本語が使えるかと調べて続けてきた。 そのとき、その調査にあたって、キャラクタセットを変更するために、 SET NAMES を使ってきた。
しかし、昨年末、重大な報告が MySQL ABのキャラクタセットの専門家より やってきたのである。その内容によると、今までここで書き連ねたことの 前提であったものがひっくり返ってしまったのである。
つまり、SET NAMES によってメタデータで使えるキャラクタセットを指定していた つもりだのだが、
SET NAMES は、メタデータに対しては無効
ということで、現在仕様はそうなっているとのこと。
詳しいことは、 日本MySQLユーザ会のメーリングリストの mysql:12598 を見て欲しい。
では、どうやれば、sjis や cp932 でも動作するのかと言うと、 以下の方法で可能とのことである。
mysql --default-character-set=sjis のようにしてクライアントを起動する。
あるいはmy.cnf (my.ini) の[mysql]あるいは[client]セクションに以下を記入する。
default-character-set=sjis
実証実験
では、mysqlクライアントを起動するときに、オプションをつけて cp932 を デフォルトキャラクタセットとして指定してみよう。
$ mysql -u root --default_character_set=cp932 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 to server version: 5.0.18-standard-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | cp932 | | character_set_connection | cp932 | | character_set_database | latin1 | | character_set_results | cp932 | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+--------+ 6 rows in set (0.00 sec) mysql>
もちろん、ターミナルの方も、cp932(Shift-JIS)にしてある。
次に、以前エラーになったテーブルを再び作ってみよう。 テーブルのデフォルトキャラクタも cp932を指定しておく。
mysql> CREATE TABLE `図` ( `形` VARCHAR(20) )
-> DEFAULT CHARSET=cp932;
Query OK, 0 rows affected (0.00 sec)
mysql> DESCRIBE `図`;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| 形 | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql>
エラーも出ずに、テーブルが作れるようだ。
次に、実際にデータを入れて、SELECTしてみよう。
mysql> INSERT INTO `図` (`形`) VALUES ('三角形'),('台形');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM `図`;
+--------+
| 形 |
+--------+
| 三角形 |
| 台形 |
+--------+
2 rows in set (0.00 sec)
mysql>
確かに、メールの通りで、SET NAMES で駄目だった CREATE TABLE 文が問題なく動いている。
考察
通常のアプリケーションで、頻繁にキャラクタセットを実行中に変更することは まずありえない。あるアプリケーションは、 必ず特定のデフォルトキャラクタセットで動作するのが常識で、 この連載のように、あれこれキャラクタセットを変更しまくる 事態は現実的ではない。
ということで、何等かの方法で、クライアントのデフォルトのキャラクタセットを 起動時に指定しないといけないことを記憶しておこう。
メタデータのキャラクタセットの指定は、起動時のみ有効。
SET NAMES による変更は、メタデータには無効
やれやれ。
と言うわけで、今まで書いたことで、SET NAMES としてテストしていた部分は、 起動時に指定するようにして全部テストし直して、書き直しが妥当だとは 思うのだが、新年早々そんな気力は出そうもないので、各自で確認して欲しい。 まあ、特別に注意しておいた方が良いような事態が発覚したら、ぜひ教えて欲しい。
次へ:ビューの作成
フィードバック:
There is no comment.