MySQL において、データベースはデータディレクトリ内のディレクトリに対応しています。データベース内の各テーブルも、データベースディレクトリ内の少なくとも 1 つ (ストレージエンジンによってはそれ以上) のファイルに対応しています。トリガーもファイルに対応しています。この結果、基になるオペレーティングシステムで大文字と小文字が区別されるかどうかが、データベース名、テーブル名、およびトリガー名で大文字と小文字が区別されるかどうかに影響します。これは、Windows ではこれらの名前は大文字と小文字が区別されませんが、多くの Unix では大文字と小文字が区別されることを意味します。ただし、注意が必要な例外の 1 つに OS X があります。OS X は Unix をベースにしますが、大文字と小文字が区別されないデフォルトのファイルシステムタイプ (HFS+) を使用します。ただし、OS X は UFS ボリュームもサポートしています。UFS ボリュームでは Unix の場合と同じように大文字と小文字が区別されます。セクション1.7.1「標準 SQL に対する MySQL 拡張機能」を参照してください。このセクションで後述するように、lower_case_table_names
システム変数も、サーバーが識別子の大文字と小文字をどのように扱うかに影響を与えます。
一部のプラットフォームでは、データベース名、テーブル名、およびトリガー名で大文字と小文字が区別されませんが、これらの名前の 1 つを参照するのに、同じステートメント内で大文字と小文字が異なる名前を使用しないでください。次のステートメントは、同じテーブルを my_table
および MY_TABLE
として参照するため、機能しません。
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
カラム名、インデックス名、ストアドルーチン名、およびイベント名は、どのプラットフォームでも大文字と小文字が区別されません。カラムのエイリアスも同様です。
ただし、ログファイルグループの名前では大文字と小文字が区別されます。これは標準 SQL とは異なります。
デフォルトで、Unix ではテーブルのエイリアスは大文字と小文字が区別されますが、Windows または OS X では区別されません。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
システム変数の影響を受けます。このシステム変数は、mysqld の起動時に設定できます。lower_case_table_names
には、次の表に示す値を設定できます。この変数は、トリガー識別子の大文字と小文字の区別には影響を及ぼしません。Unix では、lower_case_table_names
のデフォルト値は 0 です。Windows では、デフォルト値は 1 です。OS X では、デフォルト値は 2 です。
値 | 意味 |
---|---|
0 |
テーブル名とデータベース名は、CREATE TABLE または CREATE DATABASE ステートメントで指定された大文字または小文字を使用してディスク上に格納されます。名前比較では大文字と小文字が区別されます。大文字小文字を区別しないファイル名を持つシステム (Windows や OS X など) で MySQL を実行する場合、この変数を 0 に設定しないでください。大文字と小文字を区別しないファイルシステムで --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 を停止し、新しい変数設定で再起動する必要があります。個々のテーブルに対してこれを行うには、RENAME TABLE
を使用します。
RENAME TABLE T1 TO t1;
1 つ以上のデータベース全体を変換するには、lower_case_table_names
の設定前にこれらをダンプし、続いてデータベースを削除して、lower_case_table_names
の設定後にこれらをリロードします。
-
mysqldump を使用して各データベースをダンプします。
mysqldump --databases db1 > db1.sql mysqldump --databases db2 > db2.sql ...
再作成する必要のあるデータベースごとにこれを行います。
DROP DATABASE
を使用して各データベースを削除します。サーバーを停止し、
lower_case_table_names
を設定して、サーバーを再起動します。-
データベースごとにダンプファイルをリロードします。
lower_case_table_names
が設定されているので、それぞれのデータベース名とテーブル名は、再作成されるときに小文字に変換されます。mysql < db1.sql mysql < db2.sql ...
バイナリ照合順序に応じて大文字形式が同等である場合、オブジェクト名は複製と見なされる場合があります。これは、カーソル、条件、プロシージャー、関数、セーブポイント、ストアドルーチンパラメータ、ストアドプログラムローカル変数、およびプラグインの名前にも当てはまります。カラム、制約、データベース、パーティション、PREPARE
を使用して準備されたステートメント、テーブル、トリガー、ユーザー、およびユーザー定義変数の名前には当てはまりません。
ファイルシステムの大文字と小文字の区別は、INFORMATION_SCHEMA
テーブルの文字列カラムでの検索に影響する場合があります。詳細は、セクション10.1.7.9「照合順序と INFORMATION_SCHEMA 検索」を参照してください。
##Cmd-Line=Yes
##my.ini=Yes
##System =Yes
##Scope =Global
##Dynamic=No
## 0 store=lowercase ; compare=sensitive (works only on case sensitive file systems )
## 1 store=lowercase ; compare=insensitive
## 2 store=exact ; compare=insensitive (works only on case INsensitive file systems )
#default is 0/Linux ; 1/Windows