MySQL道普請便り

第128回 データベース名,テーブル等で使用できる文字種を確認してみる

この記事を読むのに必要な時間:およそ 6 分

数字単体

さて,続いて数字単体のデータベースを作成してみましょう。

mysql> create database 1;
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 '1' at line 1

残念なことに構文エラーになってしまいました。しかし,以下のように「`」⁠バッククオート)で挟んで,引用符で囲ってあげることで回避することができます。

mysql> create database `1`;
Query OK, 1 row affected (0.01 sec)

mysql> show databases like '1';
+--------------+
| Database (1) |
+--------------+
| 1            |
+--------------+

続けてテーブルも作成してみましょう。databaseを変更する時は引用符は不要なようです。

mysql> use 1
Database changed

まずは引用符を付けずに実行してみます。

mysql> create table 1 (1 int);
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 '1 (1 int)' at line 1

エラーが発生しました。テーブル名とカラム名のそれぞれを引用符で囲って試してみます。

mysql> create table `1` (1 int);
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 '1 int)' at line 1
mysql> create table 1 (`1` int);
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 '1 (`1` int)' at line 1

どちらもエラーとなりました。最後にテーブル名とカラム名を引用符で囲ってみます。

mysql> create table `1` (`1` int);
Query OK, 0 rows affected (0.02 sec)
mysql> show create table `1`;
+-------+--------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                 |
+-------+--------------------------------------------------------------------------------------------------------------+
| 1     | CREATE TABLE `1` (
  `1` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci |
+-------+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

ということで作成できました。このように通常使えない文字列であっても,引用符を使うと例外的に使用できることがわかりました。

記号文字列

ASCII文字列で定義できる文字列のうち,いくつか扱いが特殊な文字列があるので,分けて紹介していきます。基本的には,引用符をつけると使用することができます。試しに「+」で作成してみましょう。

mysql> show create table +;
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 database `+`;
Query OK, 1 row affected (0.01 sec)

mysql> use +
Database changed

以上のように作成できるようになったことがわかります。これまでのことから察しの良い方はわかるかと思いますが,同様にテーブルとカラムも引用符で囲めば,記号文字列を使用することができます。

mysql> create table `+` (`+` int);
Query OK, 0 rows affected (0.03 sec)

mysql> show create table `+`;
+-------+--------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                 |
+-------+--------------------------------------------------------------------------------------------------------------+
| +     | CREATE TABLE `+` (
  `+` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci |
+-------+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

$と_

ASCII文字列のうち,⁠\$」「_」の文字列は引用符なしで作成できるASCII文字列になります。実際に試してみようと思います。

mysql> create database $;
Query OK, 1 row affected (0.00 sec)
mysql> show databases like '$';
+--------------+
| Database ($) |
+--------------+
| $            |
+--------------+

mysql> create database _;
Query OK, 1 row affected (0.01 sec)

mysql> show databases like '\_';
+---------------+
| Database (\_) |
+---------------+
| _             |
+---------------+
1 row in set (0.00 sec)

それぞれ引用符なしで作成できることがわかりました。show databaseをしているところで「\」を挟んでいる理由としては,like文で「_」はワイルドカードとして扱われてしまうので,その他の1文字のデータベースが表示されてしまうため,エスケープをしています。

空白文字

空白文字は引用符なしで使用できないことは,create database文に2つ引数を渡すことになってしまうということから何となく分かると思います。一応試してみましょう。

「a b」という,aとbの間に空白を入れたdatabaseを作成していきましょう。

mysql> create database a b;
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 'b' at line 1

エラーが発生しました。やはり無理なようです。続けて,引用符で空白文字と文字列を囲って試してみましょう。以下のパターンで試してみます。

  • 空白文字単体のパターン
  • 先頭に空白文字が入るパターン
  • 途中に空白文字が入るパターン
  • 末尾に空白文字が入るパターン

上記を順に試していきます。

まずは空白文字単体のパターンです。

mysql> create database ` `;
ERROR 1102 (42000): Incorrect database name ' '

不正なデータベース名と怒られてしまいました。

続いて先頭に空白文字が入るパターンです。

mysql> create database ` a`;
Query OK, 1 row affected (0.00 sec)

mysql> show databases like ' a';
+---------------+
| Database ( a) |
+---------------+
|  a            |
+---------------+
1 row in set (0.00 sec)

mysql> show databases like 'a';
Empty set (0.00 sec)

問題なく作成されていることがわかりました。ただし,こちらはパット見で先頭にスペースが入っているのがわかりづらいのと,useする時に引用符が必要になるので,嫌がらせ以外で使うのはやめたほうが良いかもしれません。

mysql> use a
ERROR 1049 (42000): Unknown database 'a'

mysql> use ` a`
Database changed

続いて,文中に空白文字が入る場合です。

mysql> create database `a a`;
Query OK, 1 row affected (0.01 sec)

mysql> show databases like 'a a';
+----------------+
| Database (a a) |
+----------------+
| a a            |
+----------------+
1 row in set (0.00 sec)

こちらも作成できました。ただしuseをするときには引用符を使わないとできません。

mysql> use a a
ERROR 1049 (42000): Unknown database 'a'
mysql> use `a a`
Database changed

最後に,末尾に空白文字が入るパターンを試してみます。

mysql> create database `a `;
ERROR 1102 (42000): Incorrect database name 'a '

不正な文字列として扱われてしまいました。

ということで,空白文字を使いたい場合は他の文字列と合わせて引用符を利用して使用しましょう。

日本語

さて,日本語でデータベースやテーブルは作成できるのでしょうか?

mysql> create database 日本語テスト;
Query OK, 1 row affected (0.00 sec)

mysql> show databases like '日本語テスト';
+-------------------------------+
| Database (日本語テスト)       |
+-------------------------------+
| 日本語テスト                  |
+-------------------------------+
1 row in set (0.00 sec)

というわけで,特に問題なく日本語を使用することができました。Java等の特定のプログラミング言語では日本語をキーワードとして利用できるので,組み合わせてみてもおもしろいかもしれません。

絵文字

最後に絵文字を試してみましょう。

mysql> create database ☺;
Query OK, 1 row affected (0.00 sec)


mysql> show databases like '☺';
+----------------+
| Database (☺)   |
+----------------+
| ☺              |
+----------------+
1 row in set (0.00 sec)

このように使用できることがわかりました。

ただし使える文字種がU+0080~U+FFFFと限られているため,🍣や🍺等の文字列を入れると壊れてしまいます。一応入れることはできますが,表示は?となってしまうため,やめておいたほうが無難だと思います。

絵文字のデータベースやテーブルなどが使えるとおもしろいですね。

まとめ

今回の結果から,皆さんが思ったよりも柔軟な文字列で登録できることがわかったのではないかと思います。特に絵文字まみれのテーブルは面白いと思うので,ぜひ一度皆さんも(本番環境以外で)絵文字のテーブルを作ってみてはいかがでしょうか?

著者プロフィール

木村浩一郎(きむらこういちろう)

株式会社オプティム 技術統括本部のエンジニア。最近はミドルウェア・インフラ周りのことも少しずつ学習しています。趣味は将棋。好きな戦法は四間飛車。

Twitter:@kk2170