データベース、テーブル、インデックス、カラム、エイリアス、ビュー、ストアドプロシージャ、パーティション、テーブルスペース、リソースグループ、その他のオブジェクト名など、MySQL 内の特定のオブジェクトは識別子と呼ばれます。 このセクションでは、MySQL で使用可能な識別子の構文について説明します。セクション9.2.1「識別子の長さ制限」 は、各タイプの識別子の最大長を示します。セクション9.2.3「識別子の大文字と小文字の区別」 では、大/小文字が区別される識別子のタイプとその条件について説明します。
識別子は引用符で囲むことも囲まないこともあります。 識別子に特殊文字が含まれている場合、または識別子が予約語である場合、その識別子を参照するときは必ず引用符で囲む必要があります。 (例外: 修飾名内でピリオドのあとに続く予約語は識別子である必要があるため、引用符で囲む必要はありません。) 予約語はセクション9.3「キーワードと予約語」に記載されています。
内部的に、識別子は Unicode (UTF-8) に変換され、格納されます。 識別子に使用できる Unicode 文字は、Basic Multilingual Plane (BMP) の Unicode 文字です。 補助文字は許可されません。 したがって、識別子には次の文字を含めることができます:
-
引用符で囲まれていない識別子で許可される文字。
ASCII: [0-9,a-z,A-Z$_] (基本的なラテン文字、0-9 の数字、ドル、下線)
拡張: U+0080 .. U+FFFF
-
引用符で囲まれている識別子で許可される文字には、U+0000 を除き、完全な Unicode Basic Multilingual Plane (BMP) が含まれます。
ASCII: U+0001 .. U+007F
拡張: U+0080 .. U+FFFF
ASCII NUL (U+0000) と補助文字 (U+10000 以上) は、引用符で囲まれた識別子または引用符で囲まれていない識別子では許可されません。
識別子は数字で始めることができますが、引用符で囲まれていないかぎり、数字のみで構成することはできません。
データベース名、テーブル名、およびカラム名は、空白文字で終えることはできません。
識別子引用符文字は逆引用符 (`
) です。
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
ANSI_QUOTES
SQL モードが有効になっている場合、二重引用符内で識別子を引用符で囲むことも許可されています。
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
ANSI_QUOTES
モードでは、サーバーは二重引用符で囲まれた文字列を識別子として解釈します。 この結果、このモードが有効になっているときには、文字列リテラルは単一引用符で囲む必要があります。 二重引用符で囲むことはできません。 サーバー SQL モードは、セクション5.1.11「サーバー SQL モード」で説明しているように制御されます。
識別子が引用符で囲まれていれば、識別子引用符文字を識別子内に含めることができます。 識別子内に含める文字が識別子自体を囲むのに使用している引用符と同じ場合、文字を二重にする必要があります。 次のステートメントは、c"d
という名前のカラムを含んだ a`b
という名前のテーブルを作成します。
mysql> CREATE TABLE `a``b` (`c"d` INT);
クエリーの選択リストで、引用したカラムエイリアスを指定するには、識別子または文字列引用文字を使用します。
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
| 1 | 2 |
+-----+-----+
ステートメント内のどこに指定する場合でも、エイリアスへの引用した参照には、識別子引用符を使用する必要があります。そうしないと、参照は文字列リテラルとして扱われます。
や M
e
(この場合の M
eN
M
と N
は整数) で始まる名前を使用しないことが推奨されています。 たとえば、1e
を識別子として使用しないでください。これは、1e+3
などの式があいまいになるためです。 コンテキストに応じて、式 1e + 3
として、または数値 1e+3
として解釈される場合があります。
テーブルネーム名を作成するのに MD5()
を使用する場合は注意が必要です。なぜなら、これは、前述のような不正な形式やあいまいな形式で名前を生成する可能性があるからです。
ユーザー変数は、識別子または識別子の一部として SQL ステートメントの中で直接使用することはできません。 回避策の詳細と例については、セクション9.4「ユーザー定義変数」を参照してください。
セクション9.2.4「識別子とファイル名のマッピング」で説明しているように、データベース名とテーブル名内の特殊文字は、対応するファイルシステム名でエンコードされます。