データベースを作成する際に、
今回はデータベース名やテーブル、
検証環境
今回は、
git cloneしてきたディレクトリに入り、
$ docker-compose build $ docker-compose up -d $ docker-compose exec mysql /bin/sh # mysql -uroot -ppassword mysql>
mysqlクライアントが使用できる環境が、
公式のドキュメント
今回試した事はMySQL公式のドキュメント(9.
使用できる文字列の調査
今回試してみるのは以下の文字列になります。
- 英字
- 英数字
- 数字
- 記号
- 空白文字
- 絵文字
これらについて、
英字
とりあえずは基本的な英数字から確認してみようと思います。できるとわかっているところも一応やってみます。
データベースを作成してみましょう。
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文字列のうち、
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をしているところで
空白文字
空白文字は引用符なしで使用できないことは、
「a b」
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)
問題なく作成されていることがわかりました。ただし、
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)
というわけで、
絵文字
最後に絵文字を試してみましょう。
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と限られているため、
絵文字のデータベースやテーブルなどが使えるとおもしろいですね。
まとめ
今回の結果から、