MySQL において、データベースはデータディレクトリ内のディレクトリに対応しています。 データベース内の各テーブルも、データベースディレクトリ内の少なくとも 1 つ (ストレージエンジンによってはそれ以上) のファイルに対応しています。 トリガーもファイルに対応しています。 この結果、基になるオペレーティングシステムで大文字と小文字が区別されるかどうかが、データベース名、テーブル名、およびトリガー名で大文字と小文字が区別されるかどうかに影響します。 つまり、このような名前は Windows では大文字と小文字が区別されませんが、ほとんどの種類の Unix では大文字と小文字が区別されます。 特に重要な例外は、Unix ベースであるが、大/小文字を区別しないデフォルトのファイルシステムタイプ (HFS+) を使用する macOS です。 ただし、macOS は UFS ボリュームもサポートします。UFS ボリュームでは、Unix と同様に大文字と小文字が区別されます。 セクション1.7.1「標準 SQL に対する MySQL 拡張機能」を参照してください。 このセクションで後述するように、lower_case_table_names
システム変数も、サーバーが識別子の大文字と小文字をどのように扱うかに影響を与えます。
一部のプラットフォームでは、データベース名、テーブル名およびトリガー名の大/小文字は区別されませんが、同じステートメント内で異なる大/小文字を使用してこれらのいずれかを参照しないでください。 次のステートメントは、同じテーブルを my_table
および MY_TABLE
として参照するため、機能しません。
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
パーティション名、サブパーティション名、カラム名、インデックス名、ストアドルーチン名、イベント名およびリソースグループ名は、プラットフォームでは大/小文字が区別されず、カラムのエイリアスでもありません。
ただし、ログファイルグループの名前では大/小文字が区別されます。 これは標準 SQL とは異なります。
デフォルトでは、テーブルのエイリアスは Unix では大/小文字が区別されますが、Windows または macOS では区別されません。 Unix では、次のステートメントは、エイリアスを a
と A
の両方で参照しているので機能しません。
mysql> SELECT col_name FROM tbl_name AS a
WHERE a.col_name = 1 OR A.col_name = 2;
ただし、Windows ではこの同じステートメントは許可されます。 このような違いで生じる問題を回避するために、データベースとテーブルの作成および参照では常に小文字の名前を使用するなどの一貫した規則を設けることをお勧めします。 この規則は移植性と使いやすさを最大限にするために推奨されています。
テーブル名およびデータベース名をディスクに格納して MySQL で使用する方法は、lower_case_table_names
システム変数の影響を受けます。lower_case_table_names
は、次のテーブルに示す値を取ることができます。 この変数は、トリガー識別子の大文字と小文字の区別には影響を及ぼしません。 Unix では、lower_case_table_names
のデフォルト値は 0 です。 Windows, では、デフォルト値は 1 です。 macOS では、デフォルト値は 2 です。
lower_case_table_names
は、サーバーの初期化時にのみ構成できます。 サーバーの初期化後の lower_case_table_names
設定の変更は禁止されています。
値 | 意味 |
---|---|
0 |
テーブル名とデータベース名は、CREATE TABLE または CREATE DATABASE ステートメントで指定された大文字または小文字を使用してディスク上に格納されます。 名前の比較では大文字と小文字が区別されます。 大/小文字を区別しないファイル名 (Windows や macOS など) を持つシステムで MySQL を実行している場合は、この変数を 0 に設定しないでください。 大文字と小文字を区別しないファイルシステムで --lower-case-table-names=0 を使用して強制的にこの変数を 0 に設定し、大文字と小文字を変えて MyISAM テーブル名にアクセスした場合、インデックスが破損することがあります。 |
1 |
テーブル名はディスクに小文字で格納され、名前の比較では大/小文字は区別されません。 MySQL では、保存およびルックアップ時にすべてのテーブル名が小文字に変換されます。 この動作はデータベース名やテーブルエイリアスにも適用されます。 |
2 |
テーブル名とデータベース名は、CREATE TABLE または CREATE DATABASE ステートメントで指定された大文字または小文字を使用してディスク上に格納されますが、MySQL ではルックアップ時に小文字に変換されます。 名前の比較では、大文字と小文字は区別されません。 これは、大/小文字が区別されないファイルシステムでのみを動作させます。 InnoDB のテーブル名およびビュー名は、lower_case_table_names=1 の場合と同様に小文字で格納されます。 |
MySQL を単一のプラットフォームでのみ使用している場合は、通常、デフォルト以外の lower_case_table_names
設定を使用する必要はありません。 ただし、ファイルシステム上の大文字と小文字の区別が異なるプラットフォーム間でテーブルを転送する場合は、問題が生じる可能性があります。 たとえば、Unix 上では my_table
と MY_TABLE
という名前の異なる 2 つのテーブルを使用できますが、Windows 上ではこれらは同一のものとして扱われます。 データベース名やテーブル名の大文字と小文字の区別が原因で発生するデータ転送の問題を回避するには、次の 2 つのオプションがあります。
lower_case_table_names=1
を全システムで使用してください。 これの主な欠点は、SHOW TABLES
またはSHOW DATABASES
を使用したときに、元の大文字または小文字で名前が表示されないことです。-
Unix 上では
lower_case_table_names=0
を、Windows 上ではlower_case_table_names=2
を使用してください。 これでデータベース名とテーブル名の大文字と小文字の区別が保持されます。 この欠点は、ユーザーのステートメントが、Windows 上で正しい大文字または小文字でデータベース名およびテーブル名を常に参照していることを確認する必要があることです。 大文字と小文字が区別される Unix にステートメントを転送する場合、大文字と小文字が正しくなければこのステートメントは機能しません。例外:
InnoDB
テーブルを使用していて、これらのデータ転送の問題を回避しようとしている場合は、すべてのプラットフォームでlower_case_table_names=1
を使用して名前を強制的に小文字に変換する必要があります。
バイナリ照合順序に応じて大文字形式が同等である場合、オブジェクト名は複製と見なされる場合があります。 これは、カーソル、条件、プロシージャー、関数、セーブポイント、ストアドルーチンパラメータ、ストアドプログラムローカル変数、およびプラグインの名前にも当てはまります。 カラム、制約、データベース、パーティション、PREPARE
を使用して準備されたステートメント、テーブル、トリガー、ユーザー、およびユーザー定義変数の名前には当てはまりません。
ファイルシステムの大文字と小文字の区別は、INFORMATION_SCHEMA
テーブルの文字列カラムでの検索に影響する場合があります。 詳細は、セクション10.8.7「INFORMATION_SCHEMA 検索での照合の使用」を参照してください。