読者です 読者をやめる 読者になる 読者になる

MySQLのテーブルのファイル名(記号を含むテーブル)

 ふと、「MySQLってテーブル名にハイフンを使用できたよな」と思い出したことから、「そういえばハイフンとマイナス(引き算)って混同しないのかな」と気になりました。
この疑問自体の答えは簡単で、
「そのまま記述すると問題のあるテーブル名はバッククォート(`)でくくる」
というだけなのですが、実際にOS側に作成されるファイルのファイル名が、以前と違っていたのがおもしろかったので、書いておきます。

mysql> create table `test-one` (a int, b varchar(20));

 としてテーブルを作成すると、

-rw-r-----. 1 ec2-user ec2-user  8578 Jan 25 06:31 test@002done.frm
-rw-r-----. 1 ec2-user ec2-user 98304 Jan 25 06:31 test@002done.ibd

 のようにファイルが作成されます。 @0002d がハイフンですね。

ということは他の記号も問題なく使える?

mysql> create table `test*two` (a int, b varchar(20));

 としてみました。

-rw-r-----. 1 ec2-user ec2-user  8578 Jan 25 06:52 test@002atwo.frm
-rw-r-----. 1 ec2-user ec2-user 98304 Jan 25 06:52 test@002atwo.ibd

 @0002a がアスタリスク記号ですね。

 他の記号も行けちゃいそうなので、試してみます。

mysql> create table `!"#$%&'()@[]*+:;/?,<>` (a int, b varchar(20));

 そもそも記号で始まっても良いのか?という疑問もありますが、やってみます。
 結果は・・・

-rw-r-----. 1 ec2-user ec2-user  8578 Jan 25 06:52 @0021@0022@0023@0024@0025@0026@0027@0028@0029@0040@005b@005d@002a@002b@003a@003b@002f@003f@002c@003c@003e.frm
-rw-r-----. 1 ec2-user ec2-user 98304 Jan 25 06:52 @0021@0022@0023@0024@0025@0026@0027@0028@0029@0040@005b@005d@002a@002b@003a@003b@002f@003f@002c@003c@003e.ibd

  おおお!!!!

 こんな名前のテーブル、使えるのかなって思いますよね。

mysql> insert into `!"#$%&'()@[]*+:;/?,<>` values (1,'mydata');
Query OK, 1 row affected (0.00 sec)

mysql> select * FROM `!"#$%&'()@[]*+:;/?,<>`;
+------+--------+
| a    | b      |
+------+--------+
|    1 | mydata |
+------+--------+
1 row in set (0.00 sec)

 なんの問題もありません! 使い勝手はともかくとして。


 マニュアルによるとクォートした場合は、識別子として

Permitted characters in quoted identifiers include the full Unicode Basic Multilingual Plane (BMP), except U+0000:

ASCII: U+0001 .. U+007F
Extended: U+0080 .. U+FFFF

だそうです。

MySQL :: MySQL 5.7 Reference Manual :: 10.2 Schema Object Names