データベース、テーブル、インデックス、カラム、エイリアス、ビュー、ストアドプロシージャー、パーティション、テーブル領域、その他のオブジェクト名など、MySQL 内にあるいくつかのオブジェクトは識別子として知られています。この節では MySQL の識別子で使用できる構文を記述します。項5.2.2. 「識別子の大文字小文字の区別」では、どのタイプの識別子がどのような条件のもとで大文字と小文字を区別するのかについて説明します。
識別子を引用符で囲んだり、引用符を取り除くことができます。識別子に特殊文字が含まれている場合、または識別子が予約語である場合、その識別子を参照するときは必ず引用符で囲む必要があります。現在のキャラクタセットの一連の英数字、「_
」、および
「$
」
は特殊文字ではありません。予約語は項5.3. 「MySQL での予約語の扱い」に記載されています。(例外:
修飾名内でピリオドのあとに続く予約語は識別子であるため、引用符で囲む必要はありません。)
識別子引用符文字は逆引用符
(「`
」) です。
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
ANSI_QUOTES
モードで MySQL
を実行する場合は、識別子を囲む引用符として二重引用符も使用できます。
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
モードはServer SQL Modesで表現されるように制御されています。
識別子が引用符で囲まれていれば識別子の引用符文字を識別子内に含むことができます。識別子内に含まれる文字が識別子を囲むのに使用している引用符と同じ場合、文字を二重にする必要があります。下記のステートメントは
a`b
という
c"d
カラムを含んだテーブルを作成します。
mysql> CREATE TABLE `a``b` (`c"d` INT);
エイリアスは、識別子または文字列として引用符で囲むことができます。
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
| 1 | 2 |
+-----+-----+
識別子は 1 つのディジットで始まることもありますが、引用されないかぎりはディジットのみで構成されることはありません。
や
M
e
(この場合の M
eN
M
と
N
は整数)
で始まる名前を使用することはお勧めできません。たとえば、1e
を識別子として使用しないでください。これは、1e+3
などの式があいまいになるためです。コンテキスト応じて、式
1e + 3
として、または数値
1e+3
として解釈される場合があります。
B テーブルネーム名を作成するのに
MD5()
を使用する場合は注意が必要です。というのも、記述されたものがそのまま表現されてしまうといった、無効なフォーマットやあいまいなフォーマット名を作成する可能性があるからです。
ユーザー変数は、識別子または識別子の一部として SQL ステートメントの中で直接使用することはできません。回避策の詳細と例については、項5.4. 「ユーザー定義変数」を参照してください。
識別子に現れる文字には制限があります。
識別子に ASCII NUL
(0x00
)
を含めることはできません。
データベース名、テーブル名、そしてカラム名はスペース文字で終われません。
MySQL 5.1.6
よりも前のバージョンでは、データベース名やテーブル名に
「/
」、「\
」、「.
」、またはファイル名で許可されていない文字を含めることはできません。
MySQL 5.1.6
以降のバージョンでは、データベース名とテーブル名に含まれる特殊文字は、項5.2.3. 「識別子からファイル名へのマッピング」で説明されているとおり、対応するファイルシステム名にエンコードされます。MySQL
5.1.6
よりも前のバージョンのデータベースまたはテーブル内で特殊文字を使用し、その配下のディレクトリ名やファイル名が、その特殊文字に新しいエンコーディングを使用するように更新されていない場合、サーバーはそれらの名前に
#mysql50#
という接頭辞を付けて表示します。そういった名称を検索、またはそれらを新しいエンコーディングに変換するには、その節を参照してください。
下記テーブルは各識別子の長さ(最長時)記しています。
識別子 | 最大長 (文字) |
データベース | 64 |
テーブル | 64 |
カラム | 64 |
インデックス | 64 |
制約 | 64 |
ストアドファンクションまたはプロシージャー | 64 |
トリガー | 64 |
ビュー | 64 |
イベント | 64 |
テーブル領域 | 64 |
ログファイルグループ | 64 |
エイリアス | 256 (表のあとの例外を参照) |
MySQL 5.1.23
以降のバージョンでは、CREATE
VIEW
ステートメント内のカラム名のエイリアスは、64
文字の最大カラム長 (256
文字の最大エイリアス長ではなく)
に基づいて確認されます。
識別子は (UTF-8)
を使って保存されます。これは.frm
ファイル内に保存されたテーブル定義の識別子と
mysql
データベース内の許可テーブルに保存された識別子に対応しています。権限テーブル内の識別子の文字列カラムの大きさは文字数で測定されます。MySQL
4.1
よりも前のバージョンとは異なり、これらのカラム内の値に充てる文字数を減らさずにマルチバイト文字を使用できます。許容される
Unicode 文字は BMP (Basic Multilingual
Plane、基本多言語面)
の文字です。補助文字は使用できません。