データベースを作成する際に、皆さんはどんな名前を設定しますか。たぶん私もそうですが、基本的には英語で構成することが多いと思います。この連載でも第2回 MySQLにはじめてのデータを入れてみる等でテストデータベースを作成したりしていましたが、その際にもデータベースやテーブル名は英語のものを利用していました。
今回はデータベース名やテーブル、カラム名で使用できる文字種を確認してみようと思います。
検証環境
今回は、第125回 phpMyAdminでDockerで建てたMySQLにアクセスするで記載したdocker-composeを利用して作成します。手元で簡単に試せるように、githubの筆者のレポジトリにサンプルコードとして置いてあるので、気軽に試したい方は、git cloneして試してみてください。試すにはdockerとdocker-composeが必要です。
git cloneしてきたディレクトリに入り、以下のコマンドを実行して見ましょう。
mysqlクライアントが使用できる環境が、簡単に立ち上がると思います。
公式のドキュメント
今回試した事はMySQL公式のドキュメント(9.2 スキーマオブジェクト名)に記載されています。結果を早く知りたい、詳細な結果が知りたい方は上記のドキュメントを一読してみると良いでしょう。
使用できる文字列の調査
今回試してみるのは以下の文字列になります。
これらについて、以下のようにcreate database, create tableを実行して、どの文字列が使えるのかを実際に試してみたいと思います。
英字
とりあえずは基本的な英数字から確認してみようと思います。できるとわかっているところも一応やってみます。
データベースを作成してみましょう。
OKが帰ってきたのでできていそうです。SHOW DATABASE
構文で確認をしてみましょう。
問題なくできていることがわかります。続いてテーブルも確認してみましょう。
ということで、問題なくできていることがわかります。
英数字
英数字が問題なく作成できるかを試してみましょう。英数字の組み合わせで作成ができるかを検証してみます。
英字が先にくるパターンと後に来るパターンで違いが起こらないかも試してみます。まずは英字が先にくるパターンを試してみましょう。
データベースは問題なく作成できました。続いてテーブルも試してみましょう。
こちらは問題なく作成できました。続けて数字が先頭のパターンも試してみます。
こちらも問題なく作成できました。ということで、数字混じりの文字列も問題なく作成することがわかりました。
数字単体
さて、続いて数字単体のデータベースを作成してみましょう。
残念なことに構文エラーになってしまいました。しかし、以下のように「`」(バッククオート)で挟んで、引用符で囲ってあげることで回避することができます。
続けてテーブルも作成してみましょう。databaseを変更する時は引用符は不要なようです。
まずは引用符を付けずに実行してみます。
エラーが発生しました。テーブル名とカラム名のそれぞれを引用符で囲って試してみます。
どちらもエラーとなりました。最後にテーブル名とカラム名を引用符で囲ってみます。
ということで作成できました。このように通常使えない文字列であっても、引用符を使うと例外的に使用できることがわかりました。
記号文字列
ASCII文字列で定義できる文字列のうち、いくつか扱いが特殊な文字列があるので、分けて紹介していきます。基本的には、引用符をつけると使用することができます。試しに「+」で作成してみましょう。
引用符を付けないと怒られてしまいますが、以下のように引用符を使用すると、データベースを作成することがわかります。
以上のように作成できるようになったことがわかります。これまでのことから察しの良い方はわかるかと思いますが、同様にテーブルとカラムも引用符で囲めば、記号文字列を使用することができます。
$と_
ASCII文字列のうち、「\$」と「_」の文字列は引用符なしで作成できるASCII文字列になります。実際に試してみようと思います。
それぞれ引用符なしで作成できることがわかりました。show databaseをしているところで「\」を挟んでいる理由としては、like文で「_」はワイルドカードとして扱われてしまうので、その他の1文字のデータベースが表示されてしまうため、エスケープをしています。
空白文字
空白文字は引用符なしで使用できないことは、create database文に2つ引数を渡すことになってしまうということから何となく分かると思います。一応試してみましょう。
「a b」という、aとbの間に空白を入れたdatabaseを作成していきましょう。
エラーが発生しました。やはり無理なようです。続けて、引用符で空白文字と文字列を囲って試してみましょう。以下のパターンで試してみます。
- 空白文字単体のパターン
- 先頭に空白文字が入るパターン
- 途中に空白文字が入るパターン
- 末尾に空白文字が入るパターン
上記を順に試していきます。
まずは空白文字単体のパターンです。
不正なデータベース名と怒られてしまいました。
続いて先頭に空白文字が入るパターンです。
問題なく作成されていることがわかりました。ただし、こちらはパット見で先頭にスペースが入っているのがわかりづらいのと、useする時に引用符が必要になるので、嫌がらせ以外で使うのはやめたほうが良いかもしれません。
続いて、文中に空白文字が入る場合です。
こちらも作成できました。ただしuseをするときには引用符を使わないとできません。
最後に、末尾に空白文字が入るパターンを試してみます。
不正な文字列として扱われてしまいました。
ということで、空白文字を使いたい場合は他の文字列と合わせて引用符を利用して使用しましょう。
日本語
さて、日本語でデータベースやテーブルは作成できるのでしょうか?
というわけで、特に問題なく日本語を使用することができました。Java等の特定のプログラミング言語では日本語をキーワードとして利用できるので、組み合わせてみてもおもしろいかもしれません。
絵文字
最後に絵文字を試してみましょう。
このように使用できることがわかりました。
ただし使える文字種がU+0080~U+FFFFと限られているため、🍣や🍺等の文字列を入れると壊れてしまいます。一応入れることはできますが、表示は?となってしまうため、やめておいたほうが無難だと思います。
絵文字のデータベースやテーブルなどが使えるとおもしろいですね。
まとめ
今回の結果から、皆さんが思ったよりも柔軟な文字列で登録できることがわかったのではないかと思います。特に絵文字まみれのテーブルは面白いと思うので、ぜひ一度皆さんも(本番環境以外で)絵文字のテーブルを作ってみてはいかがでしょうか?