9.2.2. 識別子の大文字と小文字の区別 MySQL では、データベースはデータ ディレクトリ内のディレクトリに対応します。データベース内の各テーブルは、データベース ディレクトリ内の少なくとも 1 つのファイルに対応します (ストレージ エンジンによっては複数のファイルも含まれる可能性があります)。したがって、基盤となるオペレーティング システムの大文字と小文字の区別は、データベース名とテーブル名の大文字と小文字の区別に影響します。これは、Windows ではデータベース名とテーブル名の大文字と小文字が区別されず、ほとんどの種類の Unix では大文字と小文字が区別されることを意味します。注目すべき例外の 1 つが Mac OS X です。Mac OS X は Unix ベースですが、大文字と小文字を区別しないデフォルトのファイル システム タイプ (HFS+) を使用します。ただし、Mac OS X は UFS ボリュームもサポートしており、Unix と同様に大文字と小文字が区別されます。セクション1.8.4「標準 SQL に対する MySQL 拡張機能」を参照してください。
注 一部のプラットフォームではデータベース名とテーブル名の大文字と小文字が区別されませんが、同じステートメント内で大文字と小文字が異なるデータベースまたはテーブルを参照しないでください。次のステートメントは、テーブルを my_table と MY_TABLE の両方として参照しているため、機能しません。
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1; 列、インデックス、およびストアド ルーチンの名前は、どのプラットフォームでも大文字と小文字が区別されず、列のエイリアスも区別されません。トリガー名は、標準 SQL とは異なり、大文字と小文字が区別されます。
デフォルトでは、テーブル エイリアスは Unix では大文字と小文字が区別されますが、Windows や Mac OS X では区別されません。次のステートメントは、エイリアスを a と A の両方で参照するため、Unix では機能しません。
mysql> SELECT col_name FROM tbl_name AS a -> WHERE a.col_name = 1 OR A.col_name = 2; ただし、これと同じステートメントは Windows でも許可されます。このような違いによる問題を回避するには、常に小文字の名前を使用してデータベースとテーブルを作成および参照するなど、一貫した規則を採用することをお勧めします。この規則は、最大限の移植性と使いやすさのために推奨されます。
テーブル名とデータベース名がディスクに保存され、MySQL で使用される方法は、mysqld の起動時に設定できる lower_case_table_names システム変数の影響を受けます。lower_case_table_names は、次の表に示す値を取ることができます。Unix では、lower_case_table_names のデフォルト値は 0 です。Windows では、デフォルト値は 1 です。Mac OS X では、デフォルト値は 2 です。
値 意味 0 テーブル名とデータベース名は、CREATE TABLE または CREATE DATABASE ステートメントで指定された大文字と小文字を使用してディスクに格納されます。名前の比較では、大文字と小文字が区別されます。大文字と小文字を区別しないファイル名を持つシステム (Windows や Mac 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 のように小文字で格納されます。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 に設定して、名前を強制的に小文字に変換する必要があります。
Unix で lower_case_table_names システム変数を 1 に設定する場合は、mysqld を停止して新しい変数設定で再起動する前に、まず古いデータベースとテーブルの名前を小文字に変換する必要があります。個々のテーブルに対してこれを行うには、RENAME TABLE を使用します。
テーブル T1 を 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 で準備されたステートメント、テーブル、トリガー、ユーザー、およびユーザー定義変数の名前の名前には当てはまりません。