Open Source WEB

9.2. Database, Table, Index, Column, and Alias Names の最後の方に

In MySQL 5.0, identifier quote characters can be included within 
an identifier if you quote the identifier. If the character to be 
included within the identifier is the same as that used to quote 
the identifier itself, then you need to double the character. The 
following statement creates a table named a`b that contains a column 
named c"d:

mysql> CREATE TABLE `a``b` (`c"d` INT);

メタデータにバッククォートを含むとき、そのバッククォートを二重にせよ、 ということらしい。

だから、 a`b というメタデータを指定したいときは、`a``b` となる。


シフトJISの2バイト目は危険

まあ、英語だとそれで大丈夫かも知れないが、日本語の場合、 そう簡単にはいかないのである。

シフトJIS(sjis,cp932)の場合、漢字は2バイトで表現される。 第1バイトは必ず最上位ビットが立っているため、 7ビットASCIIと重なることがない。 しかし、第2バイトは、0x40〜0x7E, 0x80〜0xFC の範囲であり、 0x40〜0x7Eが7ビットASCIIと重なり、様々な問題が起きやすい。

あらゆるソフトで、シフトJISを使った場合のトラブルは、 ずっと昔から存在し、これからも存在し続ける筈である。

さて、MySQL 5.0.15 では、実際にどんなことになるか、試してみよう。

第2バイト目がバッククォートになるシフトJISの文字を探してみよう。

第2バイト目がバッククォート

荏 8960, 柿 8A60, 義 8B60, 形 8C60, 港 8D60, ........

まず、環境をシフトJISにしよう。ここでは、cp932にしておく。

mysql> SET NAMES cp932;
Query OK, 0 rows affected (0.04 sec)
 
mysql>

「形」というカラムだけからなるテーブル「図」を作ってみよう。

mysql> CREATE TABLE `図` ( `形` VARCHAR(20) );
    `> `;
Query OK, 0 rows affected (0.06 sec)
 
ERROR 1064 (42000): You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near '' at line 1
mysql>

CREATE TABLE `図` ( `形` VARCHAR(20) ); を入力して改行したら、 `> という、まだバッククォートが閉じられていないですよ、 ということになってしまった。

`図`も、`形`も前後にバッククォートを付けているので、 ちゃんと対応している筈なのだが、ここは安易に妥協して、 バッククォートを入れてどうなるかを見た。

そうすると、OK と出てから構文エラーだと無茶なことを言う。 とにかく、どうなったかを確認しよう。

mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| 図             |
+----------------+
1 row in set (0.09 sec)
 
mysql> SHOW CREATE TABLE `図`\G
*************************** 1. row ***************************
       Table: 図
Create Table: CREATE TABLE `図` (
  `形` varchar(20) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
 
mysql>

ちゃんと「図」テーブルができ、「形」カラムができ上がっている。

では、どうやれば、エラーが出ずに、 ちゃんと一発で「形」を指定できるんだろうか。

最初の英文の説明に従うと、`を1つ余分に付けると

mysql> CREATE TABLE `図` ( `形`` VARCHAR(20) );
ERROR 1064 (42000): You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near '' at line 1
mysql>

となってしまい、テーブルは作れない。

しかし、

mysql> CREATE TABLE `図図` ( `形形` VARCHAR(20) );
Query OK, 0 rows affected (0.09 sec)
 
mysql> DESCRIBE `図図`;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| 形形  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)
 
mysql>

となって、ちゃんと出来るようだ。うーん、分からん。

今は、テーブルをCREATEしただけだが、UPDATEなどのために カラムを指定するには、またまたトラブルに巻きこまれるのが必至だ。

これ以上はテストしないが、地雷を踏むのが好きな人は、 ぜひ確かめて欲しい。


結論

シフトJIS系のキャラクタセットでメタデータを指定するのは危険

第2バイト目が `(60) になる(荏、柿、義、形、港...)は使えない。

少くとも、現状(5.0.15)ではこうなってしまった。 まだシフトJISの特殊事情には対応しきれていないようだ。

漢字をメタデータとして使うときは、 シフトJIS系統のキャラクタセット以外を使うしかあるまい。

現状では、utf8またはeucjpmsを使う方が良かろう。 EUC-JP系でも、ujisではなくeucjpmsの方が問題が少ないことについては、 この連載の、文字列処理-文字化け、新キャラクタセット(cp932,eucjpms) あたりを参考にして欲しい。

メタデータに漢字を使いたいのなら、 シフトJIS系のキャラクタセットは絶対に避けるべきである。


戻る:メタデータの前後の空白は要注意

次へ:SET NAMES はメタデータでは無効


フィードバック:

Name:
Comment:

There is no comment.

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

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