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 cp932 でキャラクタセットをSHIFT-JISにした場合について 詳しく調べてみよう。
長いデータベース名は大丈夫だろうか。
mysql> SET NAMES cp932; Query OK, 0 rows affected (0.00 sec) mysql> CREATE DATABASE 長い名前は大丈夫か; Query OK, 1 row affected (0.00 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | | 長い名前は大丈夫か | +--------------------+ 4 rows in set (0.00 sec) mysql>
長いのは問題ないようだ。
「あ」は駄目だったが、「あ」を含むもっと長い名前として 「あいうえお」というデータベース名を試してみよう。
mysql> CREATE DATABASE あいうえお; Query OK, 1 row affected (0.00 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | | あいうえお | | 長い名前は大丈夫か | +--------------------+ 5 rows in set (0.00 sec) mysql>
大丈夫だ。どういう事だろう。
今まで変になったのは、「あ、字、□」が最後になった場合である。 これらを最後につけてみよう。
mysql> CREATE DATABASE 最後の字; Query OK, 1 row affected (0.00 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | | あいうえお | | 最後の | | 長い名前は大丈夫か | +--------------------+ 6 rows in set (0.01 sec) mysql>
やっぱり、「字」が最後にあると、駄目になった。 もしかして、データベース名に「字」を指定すると、「あ」のときのように なってしまうのではないだろうか。
mysql> CREATE DATABASE 字; 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> SELECT HEX('あ字□');
+---------------+
| HEX('あ字□') |
+---------------+
| 82A08E9A81A0 |
+---------------+
1 row in set (0.01 sec)
mysql>
これを見ると、2バイト目が 9A または A0 の文字がトラブルになるらしい。
たとえば、「z」(全角英小文字)は、cp932だと 829A なので トラブルになると思われる。
mysql> create database z; 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 DATABASE 元帳; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | | 元 | +--------------------+ 4 rows in set (0.01 sec) mysql>
「元帳」を作ったら「元」だけになるのは相当まずいなぁ。
対策
ということで、cp932の場合、データベース名の最後に使ってはいけない 文字があるので、最後に何か大丈夫な文字追加してしまうという 無茶苦茶姑息な手段があるが、それは絶対に止めるべきだろう。
だからといって、データベース名の最後の1文字で使えそうに無い文字を避けるのは、 データベース名として意図していたものが使えなくなることであり、 それはやっぱり無茶苦茶困る。
さて、どうすればいいんだろう。
フィードバック:
There is no comment.