MySQL
において、データベースはデータディレクトリ内のディレクトリに対応しています。データベース内の各テーブルも、データベースディレクトリ内の少なくとも
1
つ(記憶エンジンによってはそれ以上)のファイルに対応しています。トリガーもファイルに対応しています。そのため、ベースとなるオペレーティングシステムで大文字と小文字が区別される場合、データベース名とテーブル名でも大文字と小文字が区別されます。つまり、Windows
ではデータベース名、テーブル名、およびトリガー名で大文字と小文字が区別されませんが、ほとんどの種類の
Unix
では大文字と小文字が区別されます。ただし、注意が必要な例外の
1 つに Mac OS X があります。Mac OS X は Unix
をベースとしていますが、大文字と小文字が区別されないデフォルトのファイルシステムタイプ
(HFS+) を使用します。しかし、Mac OS X は UFS
ボリュームもサポートしています。UFS
ボリュームでは Unix の場合と同じように Mac OS X
でも大文字と小文字が区別されます。詳しくはMySQL Extensions to Standard SQLを参照してください。この節に後述されているように、lower_case_table_names
システム変数も、サーバーがどのように識別子の大文字と小文字を区別するかということに影響を与えます。
一部のプラットフォームではデータベース名、テーブル名、およびトリガー名で大文字と小文字が区別されませんが、それらの名前を同じステートメント内で異なる活字ケースを使用して参照しないようにしてください。次のステートメントでは、同じテーブルが
my_table
および
MY_TABLE
として参照されています。したがって、このステートメントは機能しません。
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
カラム名、インデックス名、ストアドルーチン名、およびイベント名は、どのプラットフォームでも大文字と小文字が区別されません。カラムのエイリアスも同様です。
しかし、トリガーとログファイルグループの名前は、大文字と小文字が区別されます。これは標準 SQL とは異なります。
デフォルトで、テーブルのエイリアスは Unix
では大文字と小文字が区別されますが、Windows
や Mac OS X
では区別されません。次のステートメントでは、同じエイリアスが
a
および
A
として参照されています。
mysql>SELECT
->col_name
FROMtbl_name
AS aWHERE a.
col_name
= 1 OR A.col_name
= 2;
したがって、このステートメントは Unix では機能しません。しかし、Windows ではこの同じステートメントが機能します。このような違いがプログラムに起こらないようにするために、常に小文字を使用してデータベースとテーブルを作成および参照するなどの一貫した規則を設けてください。この規則は最大限の軽便さと使いやすさのために推奨されています。
テーブル名やデータベース名がどのようにディスクに保存され、MySQL
で使用されるかは、lower_case_table_names
システム変数の影響を受けます。このシステム変数の設定は、mysqld
の起動時に行うことができます。lower_case_table_names
には、次の表に示す値を設定できます。この変数は、トリガー識別子の大文字と小文字の区別には影響を及ぼしません。Unix
では、lower_case_table_names
のデフォルト値は 0 です。Windows
では、デフォルト値は 1 です。Mac OS X
では、デフォルト値は 2 です。
値 | 意味 |
0 |
CREATE TABLE または
CREATE
DATABASE
ステートメントで区別された大文字/小文字を使用してテーブルとデータベース名が記憶されます。名前比較では大文字と小文字が区別されます。大文字と小文字を区別しないファイルシステム上で、--lower-case-table-names=0
を使用してこの変数を 0
に設定し、異なる活字ケースを使用して
MyISAM
テーブル名にアクセスすると、インデックスが破壊される恐れがあるので注意してください。 |
1 |
テーブル名はディスク上に小文字で記憶され、名前比較では大文字小文字は区別されません。MySQL では、保管およびルックアップ時にすべてのテーブル名が小文字に変換されます。このオプションはデータベース名やテーブルエイリアスにも適用されます。 |
2 |
CREATE TABLE または
CREATE
DATABASE
ステートメントにおいて、テーブルとデータベース名は指定された大文字/小文字の形態でディスク上に記憶されますが、MySQL
ではルックアップ時に小文字に変換されます。名前比較では大文字と小文字が区別されません。これは大文字と小文字が区別されないファイルシステムで
のみ機能します。InnoDB
テーブル名は
lower_case_table_names=1
のように、小文字で記憶されます。 |
MySQL を 1
つのプラットフォームでのみ使用している場合は、通常
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
に設定して、強制的に名前が小文字に変換されるようにしてください。
Unix 上で
lower_case_table_names
システム変数を 1
に設定する場合は、最初に古いデータベース名とテーブル名を小文字に変換してから、mysqld
を停止し、新しい変数設定で再起動する必要があります。
バイナリ照合順序に応じて大文字形式が同値とみなされれば、オブジェクト名は複製として扱われます。これは、カーソル、条件、関数、プロシージャー、セーブポイント、ストアドルーチンパラメータ、ストアドプログラムのローカル変数、およびプラグインの名前には当てはまります。しかしカラム名、制約条件、データベース、パーティション、PREPARE
を使用して準備されたステートメント、テーブル、トリガー、ユーザー、そしてユーザー定義変数においては当てはまりません。