Open Source WEB

今まで長々とメタデータに日本語が使えるかと調べて続けてきた。 そのとき、その調査にあたって、キャラクタセットを変更するために、 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 としてテストしていた部分は、 起動時に指定するようにして全部テストし直して、書き直しが妥当だとは 思うのだが、新年早々そんな気力は出そうもないので、各自で確認して欲しい。 まあ、特別に注意しておいた方が良いような事態が発覚したら、ぜひ教えて欲しい。


戻る:シフトJIS系のメタデータは要注意

次へ:ビューの作成


フィードバック:

Name:
Comment:

There is no comment.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us