MySQL道普請便り

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

データベースを作成する際に、皆さんはどんな名前を設定しますか。たぶん私もそうですが、基本的には英語で構成することが多いと思います。この連載でも第2回 MySQLにはじめてのデータを入れてみる等でテストデータベースを作成したりしていましたが、その際にもデータベースやテーブル名は英語のものを利用していました。

今回はデータベース名やテーブル、カラム名で使用できる文字種を確認してみようと思います。

検証環境

今回は、第125回 phpMyAdminでDockerで建てたMySQLにアクセスするで記載したdocker-composeを利用して作成します。手元で簡単に試せるように、githubの筆者のレポジトリにサンプルコードとして置いてあるので、気軽に試したい方は、git cloneして試してみてください。試すにはdockerとdocker-composeが必要です。

git cloneしてきたディレクトリに入り、以下のコマンドを実行して見ましょう。

$ docker-compose build
$ docker-compose up -d
$ docker-compose exec mysql /bin/sh
# mysql -uroot -ppassword
mysql>

mysqlクライアントが使用できる環境が、簡単に立ち上がると思います。

公式のドキュメント

今回試した事はMySQL公式のドキュメント(9.2 スキーマオブジェクト名)に記載されています。結果を早く知りたい、詳細な結果が知りたい方は上記のドキュメントを一読してみると良いでしょう。

使用できる文字列の調査

今回試してみるのは以下の文字列になります。

  • 英字
  • 英数字
  • 数字
  • 記号
  • 空白文字
  • 絵文字

これらについて、以下のようにcreate database, create tableを実行して、どの文字列が使えるのかを実際に試してみたいと思います。

英字

とりあえずは基本的な英数字から確認してみようと思います。できるとわかっているところも一応やってみます。

データベースを作成してみましょう。

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

OKが帰ってきたのでできていそうです。SHOW DATABASE構文で確認をしてみましょう。

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

問題なくできていることがわかります。続いてテーブルも確認してみましょう。

mysql> use abcdeghijklmnopqrstuvwx
mysql> create table abcdeghijklmnopqrstuvwx (abcdeghijklmnopqrstuvwx int);
mysql> create table abcdeghijklmnopqrstuvwx (abcdeghijklmnopqrstuvwx int);
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+-----------------------------------+
| Tables_in_abcdeghijklmnopqrstuvwx |
+-----------------------------------+
| abcdeghijklmnopqrstuvwx           |
+-----------------------------------+
1 row in set (0.00 sec)

mysql> show create tables;

ということで、問題なくできていることがわかります。

英数字

英数字が問題なく作成できるかを試してみましょう。英数字の組み合わせで作成ができるかを検証してみます。

英字が先にくるパターンと後に来るパターンで違いが起こらないかも試してみます。まずは英字が先にくるパターンを試してみましょう。

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

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

データベースは問題なく作成できました。続いてテーブルも試してみましょう。

mysql> create table a1 (a1 int);
Query OK, 0 rows affected (0.01 sec)

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

こちらは問題なく作成できました。続けて数字が先頭のパターンも試してみます。

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

mysql> create table 1a (1a int);
Query OK, 0 rows affected (0.02 sec)

こちらも問題なく作成できました。ということで、数字混じりの文字列も問題なく作成することがわかりました。

数字単体

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

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と限られているため、🍣や🍺等の文字列を入れると壊れてしまいます。一応入れることはできますが、表示は?となってしまうため、やめておいたほうが無難だと思います。

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

まとめ

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

おすすめ記事

記事・ニュース一覧