Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  識別子の大文字と小文字の区別

9.2.2 識別子の大文字と小文字の区別

MySQL において、データベースはデータディレクトリ内のディレクトリに対応しています。データベース内の各テーブルも、データベースディレクトリ内の少なくとも 1 つ (ストレージエンジンによってはそれ以上) のファイルに対応しています。トリガーもファイルに対応しています。この結果、基になるオペレーティングシステムで大文字と小文字が区別されるかどうかが、データベース名、テーブル名、およびトリガー名で大文字と小文字が区別されるかどうかに影響します。これは、Windows ではこれらの名前は大文字と小文字が区別されませんが、多くの Unix では大文字と小文字が区別されることを意味します。ただし、注意が必要な例外の 1 つに OS X があります。OS X は Unix をベースにしますが、大文字と小文字が区別されないデフォルトのファイルシステムタイプ (HFS+) を使用します。ただし、OS X は UFS ボリュームもサポートしています。UFS ボリュームでは Unix の場合と同じように大文字と小文字が区別されます。セクション1.8.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 では、次のステートメントは、エイリアスを aA の両方で参照しているので機能しません。

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_tableMY_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 の設定後にこれらをリロードします。

  1. mysqldump を使用して各データベースをダンプします。

    mysqldump --databases db1 > db1.sql
    mysqldump --databases db2 > db2.sql
    ...
    

    再作成する必要のあるデータベースごとにこれを行います。

  2. DROP DATABASE を使用して各データベースを削除します。

  3. サーバーを停止し、lower_case_table_names を設定して、サーバーを再起動します。

  4. データベースごとにダンプファイルをリロードします。lower_case_table_names が設定されているので、それぞれのデータベース名とテーブル名は、再作成されるときに小文字に変換されます。

    mysql < db1.sql
    mysql < db2.sql
    ...
    

バイナリ照合順序に応じて大文字形式が同等である場合、オブジェクト名は複製と見なされる場合があります。これは、カーソル、条件、プロシージャー、関数、セーブポイント、ストアドルーチンパラメータ、ストアドプログラムローカル変数、およびプラグインの名前にも当てはまります。カラム、制約、データベース、パーティション、PREPARE を使用して準備されたステートメント、テーブル、トリガー、ユーザー、およびユーザー定義変数の名前には当てはまりません。

ファイルシステムの大文字と小文字の区別は、INFORMATION_SCHEMA テーブルの文字列カラムでの検索に影響する場合があります。詳細は、セクション10.1.7.9「照合順序と INFORMATION_SCHEMA 検索」を参照してください。


User Comments
  Posted by Anders Eriksson on January 20, 2009
How to produce a SQL script that renames all tables in a schema to its lower case form:

select concat('rename table ', table_name, ' to ' , lower(table_name) , ';') from information_schema.tables where table_schema = 'your_schema_name';

/Anders Eriksson

  Posted by Lone Wolf on December 6, 2009
Another way, via the command prompt:

cd /var/lib/mysql
for i in */*.frm; do DBASE="`dirname $i`"; TBL="`basename $i .frm`"; TBLl="`echo $TBL | tr A-Z a-z`"; if [[ "$TBL" != "$TBLl" ]] ; then echo "RENAME TABLE \`$DBASE\`.\`$TBL\` TO \`$DBASE\`.\`$TBLl\`" | mysql; fi; done
  Posted by Mircea LUTIC on February 16, 2012
##lower_case_table_names :
##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

Sign Up Login You must be logged in to post a comment.