2012-02-25 14 views
6

私たちはWindowsマシンで作業しています。一度、UNIXマシンにコードをデプロイしました。コードはWindows上で正常に動作しますが、UNIXでは正しい名前でテーブル名を変更した後に 'no such such table exists'のようなエラーが出ます。これはUNIXでもうまくいきます。実際には、ウィンドウにはデフォルトで大文字と小文字が区別されるテーブル名はありませんが、UNIXでは(実際にはMySQLテーブルはファイルであり、UNIXでは大文字と小文字が区別されますが、ウィンドウではありません。回避策は、すべてのテーブルを再度作成し、テーブル名を小文字にすることです。はい、私たちもそれを行うことができます、それは大丈夫です。MySqlで大文字と小文字を区別するテーブル名と列名を適用する方法は?

でも、私たちはMySql(Windowsマシン)のテーブル名に大文字と小文字を区別することができます。はいの場合は、その方法を教えてください。

+0

これは興味深い質問です。 Unixベースのシステムではなく、WindowsでのSQLの作業のような問題を引き起こします。 AFAIK、そこから解決策はありません。 – Nishant

答えて

4

UNIXの場合、デフォルト値はlower_case_table_namesです。Windowsの場合、デフォルト値は1です.Mac OS Xでは、MySQL 4.0.18より前のデフォルトは1、4.0.18では2です。

これを修正するには、実行しているバージョンに応じて、C:\ Program Files \ MySQL \ MySQL Server 4.1内またはその周辺のmy.iniファイルのlower_case_table_namesの設定を探します。

lower_case_table_names=0 

あなたがかどうかをテストする前に、MySQLサービスを再起動するのを忘れないでください:あなたは、設定が見つからない場合は、私がやったようには次のように、あなただけの、my.iniファイルの末尾に追加することができますできます。

プラットフォームを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を停止し、新しい変数設定で再起動する必要があります。

設定がlower_case_table_names呼ばれhttp://dev.mysql.com/doc/refman/4.1/en/identifier-case-sensitivity.html

5

これに関する追加情報については、MySQLのウェブサイトをチェックアウトし、いくつかの重要な警告をしてください。 0に設定すると、比較で大文字と小文字が区別されます。

あなたは(WindowsやMacのOS Xなど)、大文字と小文字を区別しないファイル名を持つシステム上でMySQLを実行している場合は、

あなたはこの変数を0に設定すべきではありません。大文字小文字を区別しないファイルシステムで--lower-case-table-names = 0を指定してこの変数を強制的に0にし、別の文字を使用してMyISAMのテーブル名にアクセスすると、インデックスが破損することがあります。

すべてのシステム(Linuxを含む)全体ですべてのテーブル名を小文字にします。 1の値に設定する、より良いオプションのように聞こえる:

表名は大文字と小文字を区別しませんディスクと名前の比較に小文字に格納されています。 MySQLはすべてのテーブル名をストレージとルックアップで小文字に変換します。この動作は、データベース名とテーブルのエイリアスにも適用されます。

+0

問題はWindowsマシンでは設定を変更できますが、UNIXシステムでは変更できません。このソリューションでは、UNIX上でmy.iniファイルにアクセスできる場合、この設定を1に変更して問題を解決できます。しかし、私はそれ以外の方法でそれをしたい。私は大文字と小文字を区別しないでテーブルを作るのではなく、大文字と小文字を区別してウィンドウにテーブルを入れたいと思っています。 –

+0

@Rakeshオプション '0'が表示されますが、推奨されません。私はこの問題がどのように最初に発生するのか分かりません - あなたのコードが正しい名前を使用していることを確認できませんか? Linuxにデプロイするときにテーブル名が変更されていますか? –

関連する問題