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
関連リンク
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系のキャラクタセットは絶対に避けるべきである。
フィードバック:
There is no comment.