18

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

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

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

これは簡単に解決できる問題だと思うかもしれませんが、これまでのところ私は希望を失っています. 現時点ではおそらく私を逃れている誰かが答えを持っていることを願っています.

4

6 に答える 6

20

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

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

MySQLでは、データベースはデータディレクトリ内のディレクトリに対応します。データベース内の各テーブルは、データベースディレクトリ内の少なくとも1つのファイルに対応します(ストレージエンジンによってはさらに多くのファイルに対応する場合もあります)。したがって、基盤となるオペレーティングシステムの大文字と小文字の区別は、データベース名とテーブル名の大文字と小文字の区別に影響します。つまり、データベースとテーブルの名前では、Windowsでは大文字と小文字が区別されず、ほとんどの種類のUnixでは大文字と小文字が区別されます。注目すべき例外の1つはMacOSXです。これは、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項「識別子の大文字と小文字の区別」を参照してください。

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

したがって、MySQL構成ファイルで設定lower_case_table_namesする必要があるようです。1

于 2012-06-23T01:20:23.380 に答える
13

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

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

于 2012-06-23T01:16:23.457 に答える
11

mysql 構成ファイルを編集する

nano /etc/mysql/my.cnf

またはmy.cnfあなたのを設定するために使用される他のファイルmysql.

[mysqld]

行を追加

lower_case_table_names=1

走る

sudo service mysqld restart

Windows データベースを Linux データベースに再インポートしたい場合があります。できれば、add table ステートメントと insert ステートメントを使用して、ゼロから作成します。

それは良いです!

于 2015-01-06T20:16:50.103 に答える
3

mysql の実行中に の値を変更することはできませんlower_case_table_names。起動時に設定する必要があります。編集する必要がありますmy.cnf(おそらく で/etc、おそらく別の場所で、わかりません)。その後、mysql を再起動すると、正常に動作するはずです。

于 2012-06-23T01:15:21.967 に答える
0

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

于 2015-11-21T21:54:20.590 に答える