MySQL
において、データベースはデータディレクトリ内のディレクトリに対応しています。データベース内の各テーブルも、データベースディレクトリ内の少なくとも1つ(記憶エンジンによってはそれ以上)のファイルに対応しています。そのため、ベースとなっているオペレーティングシステムで大文字と小文字が区別される場合、データベース名とテーブル名でも大文字と小文字が区別されます。つまり、Windows
ではデータベース名とテーブル名で大文字と小文字は区別されず、ほとんどの種類の
Unix
では大文字と小文字が区別されることになります。ただし、重要な例外が
1 つあります。Mac OS X
で、Unixをベースとしているがデフォルトの HFS+
ファイルシステムを使用している場合です。この場合は大文字と小文字が区別されません。しかし、Mac
OS X は UFS ボリュームもサポートしています。UFS
ボリュームでは Unix の場合と同じように Mac OS X
でも大文字と小文字が区別されます。項1.8.4. 「SQL標準に対するMySQL拡張機能」を参照してください。このセクションに後述されているように、lower_case_table_names
システム変数も、サーバがどのように識別子の大文字と小文字を区別するかということに影響を与えます。
注:いくつかのプラットフォームでは、データベース名とテーブル名で大文字と小文字は区別されませんが、同じステートメント内で異なるケースを使用して同じデータベースやテーブルを参照しないようにしてください。次のステートメントでは、同じテーブルがmy_table
およびMY_TABLE
として参照されています。したがって、このステートメントは機能しません。
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
カラム名、インデックス名、ストアされたルーチン名とカラムのエイリアスは、どのプラットフォームでも大文字と小文字が区別されません。トリガ名では大文字と小文字が区別されます。
デフォルトで、テーブルのエイリアスはUnixでは大文字と小文字が区別されますが、WindowsやMac
OS
Xでは区別されません。次のステートメントでは、同じエイリアスがa
およびA
として参照されています。したがって、このステートメントはUnixでは機能しません。
mysql>SELECT
->col_name
FROMtbl_name
AS aWHERE a.
col_name
= 1 OR A.col_name
= 2;
しかし、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を単一プラットフォームでのみ使用している場合、通常は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に設定してください。
lower_case_table_names
システム変数を1に設定する場合、新しい変数設定でmysqldを再起動する前に、まず旧データベースおよびテーブル名を小文字に変換しなければなりません。
バイナリ照合順序に応じて大文字形式が同値とみなされれば、オブジェクト名は複製として扱われます。これはカーソル名、状態名、機能名、プロシージャ名、保存ポイント、ルーチンローカル変数において当てはまります。しかしカラム名、制約条件、データベース、パーティション、PREPARE
を使用して準備されたステートメント、テーブル、トリガ、ユーザ、そしてユーザによって定義された変数においては当てはまりません。