web-dev-qa-db-ja.com

LinuxサーバーのMySQLテーブル名を大文字と小文字を区別しないように変更するにはどうすればよいですか?

Appleサーバー上でホストされていた古いWebサイトで作業しています。新しいLinuxサーバーに移行されたときに機能しなくなりました。すべてのMySQLが原因であると確信しています。 phpスクリプトで使用されるクエリでは、テーブル名の大文字と小文字の組み合わせが異なります(元の開発者がテーブル名またはphpスクリプトを作成したときに規則に従わなかった理由はわかりません)。 Windows MySQLサーバーは、デフォルトでは大文字と小文字を区別しませんが、Linuxはそうではありません。

MySQLでLinuxのデフォルトを変更して、大文字と小文字を区別せず、MacまたはWindowsのように機能させる方法はありますか?私は探していましたが、スクリプトまたはテーブル名、あるいはその両方の変更を含まない答えは見つかりませんでした。 Webサイトは、いくつかのCMSを使用して生成されている必要があるため、数十のページに数十のページがあり、各テーブルと複数のテーブルに複数のクエリを持つファイルが含まれています。私は考えられる最も賢い方法でこのタイプのソリューションを実装しようとし始めましたが、テーブル名に触れると、現在機能している他のページが機能しなくなります(サイトを壊さないようにしています)。

LinuxサーバーのWebminのMySQLサーバーコンソールにシステム変数(lower_case_table_names)がありましたが、私が読んだLinuxのサーバー変数はこの問題に対処するために0から1に変更できましたが、Webminでは「読み取り専用」であるため変更できません。 "変数。

これは簡単に解決できる問題だと思うかもしれませんが、今のところ希望を失っています。誰かが答えを出してくれればいいのにと思っています。

16
rocklandcitizen

MySQLの大文字と小文字の区別は、デフォルトではファイルシステムによって処理されます。そのため、この違いが見つかりました。

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

MySQLでは、データベースはデータディレクトリ内のディレクトリに対応します。データベース内の各テーブルは、データベースディレクトリ内の少なくとも1つのファイルに対応します(ストレージエンジンによってはさらに多くのファイルに対応します)。したがって、基になるオペレーティングシステムの大文字と小文字の区別は、データベース名とテーブル名の大文字と小文字の区別に影響します。つまり、Windowsではデータベース名とテーブル名の大文字と小文字は区別されず、ほとんどの種類のUnixでは大文字と小文字が区別されます。注目すべき例外の1つは、Mac OS Xです。これはUnixベースですが、大文字と小文字を区別しないデフォルトのファイルシステムタイプ(HFS +)を使用します。ただし、Mac OS XはUFSボリュームもサポートしており、Unixと同様に大文字と小文字が区別されます。セクション1.8.4「標準SQLのMySQL拡張機能」を参照してください。

幸い、次の文はあなたを助けることができます:

lower_case_table_names システム変数も、このセクションで後述するように、サーバーが識別子の大文字と小文字の区別を処理する方法に影響します。

lower_case_table_names宣伝文句:

0に設定すると、テーブル名は指定どおりに保存され、比較では大文字と小文字が区別されます。 1に設定すると、テーブル名はディスクに小文字で格納され、比較では大文字と小文字が区別されません。 2に設定すると、テーブル名は指定どおりに格納されますが、小文字で比較されます。このオプションは、データベース名とテーブルエイリアスにも適用されます。追加情報については、セクション9.2.2「識別子の大文字と小文字の区別」を参照してください。

MySQLを大文字と小文字を区別しないファイル名を持つシステム(WindowsやMac OS Xなど)で実行している場合は、この変数を0に設定しないでください。このようなシステムでこの変数を0に設定し、別の大文字と小文字を使用してMyISAMテーブル名にアクセスすると、インデックスが破損する可能性があります。 Windowsでは、デフォルト値は1です。MacOS Xでは、デフォルト値は2です。

したがって、lower_case_table_names1 MySQL構成ファイル内。

19
Kevin

同じ名前のMySQLサーバー変数 があります。 このヘルプページ で説明されているように、システムの起動時にその特定の変数を設定する必要があります。 DBサーバーインスタンスのMySQLオプションファイルの場所(私のものは/etc/my.cnfにあります)を見つけ、このオプションを編集/ [mysqld]セクションに追加する必要があります。

後でMySQLデーモンを再起動することを忘れないでください...

13
thkala

Mysql構成ファイルを編集します

nano /etc/mysql/my.cnf

またはその他のmy.cnfmysqlの構成に使用されるファイル。

[mysqld]

行を追加

lower_case_table_names=1

走る

Sudo service mysqld restart

WindowsデータベースをLinuxデータベースに再インポートすることができます。できれば、ゼロから、テーブルの追加とステートメントの挿入を行います。

それは良いです!

10
Sébastien

Mysqlの実行中にlower_case_table_namesの値を変更することはできません。起動時に設定する必要があります。 my.cnfを編集する必要があります(多分/etcで、多分他のどこかで、よくわかりません)。次に、mysqlを再起動すると、問題ないはずです。

3
Keith Randall

Lower_case_table_namesパラメータは、DBインスタンスを作成する前に、カスタムDBパラメータグループの一部として設定する必要があります。既存のデータベースインスタンスのlower_case_table_namesパラメーターを変更しないでください。変更すると、ポイントインタイムリカバリバックアップとリードレプリカDBインスタンスで不整合が発生する可能性があります。

0
Musa