MySQL 5.1 リファレンスマニュアル :: 8 言語構造 :: 8.2 識別子 :: 8.2.2 識別子の大文字/小文字区別
« 8.2.1 識別子の修飾語

8.2.3 ファイル名への識別子のマッピング »
Section Navigation      [Toggle]
  • 8.2 識別子
  • 8.2.1 識別子の修飾語
  • 8.2.2 識別子の大文字/小文字区別
  • 8.2.3 ファイル名への識別子のマッピング
  • 8.2.4 関数名の構文解析と名前解決

8.2.2. 識別子の大文字/小文字区別

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 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、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を使用して準備されたステートメント、テーブル、トリガ、ユーザ、そしてユーザによって定義された変数においては当てはまりません。

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates