1

MySQLテーブルを小文字でクエリしようとするとエラーが発生します:

mysql> select * from selection_vc limit 1;
ERROR 1146 (42S02): Table 'mydb.selection_vc' doesn't exist

私が大文字を使うとき、すべてがOKです:

mysql> select * from SELECTION_VC limit 1;
+-------------+-------------+-------------+--------+
| CAMPAIGN_ID | CONTACT_ID  | COLUMN_NAME | MONTH  |
+-------------+-------------+-------------+--------+
| ALCA-32515W | ALCA-2X08DX | A           | 201207 |
+-------------+-------------+-------------+--------+
1 row in set (0.00 sec)

このエラー(機能?)はテーブル名でのみ発生します。列名には小文字または大文字でアクセスできます。これは、Linuxにインストールしたデータベースでのみ発生します。Macのデータベースにはこの問題はありません。

MySQL構成で何かを見逃しましたか、それともこれはバグですか?

4

1 に答える 1

5

マニュアルの「識別子の大文字と小文字の区別」セクションで説明されているとおり:

MySQL では、データベースはデータ ディレクトリ内のディレクトリに対応します。データベース内の各テーブルは、データベース ディレクトリ内の少なくとも 1 つのファイルに対応します (ストレージ エンジンによっては複数のファイルも含まれる可能性があります)。トリガーはファイルにも対応します。したがって、基盤となるオペレーティング システムの大文字と小文字の区別は、データベース、テーブル、およびトリガー名の大文字と小文字の区別に影響します。つまり、このような名前は Windows では大文字と小文字が区別されませんが、ほとんどの種類の Unix では大文字と小文字が区別されます。注目すべき例外の 1 つが Mac OS X です。Mac OS X は Unix ベースですが、大文字と小文字を区別しないデフォルトのファイル システム タイプ (HFS+) を使用します。

続けて次のように述べています。

データベース名またはテーブル名の大文字と小文字が原因で発生するデータ転送の問題を回避するには、次の 2 つのオプションがあります。

  • すべてのシステムで使用lower_case_table_names=1します。これの主な欠点は、SHOW TABLESまたはを使用するSHOW DATABASESと、名前が元の大文字小文字で表示されないことです。

  • lower_case_table_names=0Unix およびlower_case_table_names=2Windows で使用します。これにより、データベース名とテーブル名の大文字と小文字が保持されます。これの欠点は、Windows では、ステートメントがデータベース名とテーブル名を常に正しい文字で参照するようにしなければならないことです。大文字と小文字が重要な Unix にステートメントを転送する場合、大文字と小文字が正しくないと機能しません。

    例外:InnoDBテーブルを使用していて、これらのデータ転送の問題を回避しようとしている場合はlower_case_table_names、すべてのプラットフォームで 1 に設定して、名前を強制的に小文字に変換する必要があります。

于 2012-07-04T10:18:37.377 に答える