15

データベース テーブルからオブジェクト プロパティ、列、データベース インデックス、制約に至るまで、私たちが行うすべてのことにはキャメルケースの命名規則があります。

新しいプロジェクトでこれらの規則を 2 か月間使用してきましたが、すべてが順調に進んでいましたが、昨夜突然、6 つのデータベースのうちの 1 つのみのすべてのリレーションがキャメルケースから小文字に変換されました。制約のみが変換されることに注意することが重要です。インデックス自体はキャメルケースのままです。

したがって、someColumn と別の someTable.otherColumn という名前の列がある場合、次のようになります。

someColumn => someTable.otherColumn ON DELETE CASCADE ON UPDATE CASCADE

これに:

someColumn => sometable.otherColumn ON DELETE CASCADE ON UPDATE CASCADE

何が原因でしょうか? この問題を再現することはできませんでした。ランダムな制約を変更してすべてが変更されるかどうかを確認し、構造の再インポートを試みたところ、キャメルケースをインポートから除外して問題なく動作しました。

OSX で作業し、CentOS にデプロイします。

編集: ある開発者は、大文字と小文字を区別しない OSX を使用しています。彼は自分のマシンでエクスポートからデータベースを再インポートしようとしましたが、それでも問題ありませんでした。したがって、大文字と小文字を区別しないマシンから大文字と小文字を区別する CentOS にダンプをインポートしても、問題は発生しませんでした。mysqld を再起動しても、このバグは再現されませんでした。すべての強制小文字の mysql 設定はオフです。今日まで、私たちはそれを再び実現することができませんでした。

Edit2: これは当社の CentOS 開発サーバーでのみ発生したことに注意してください。大文字と小文字を区別しない OS を使用する開発者は、以前に大文字と小文字を区別するシステムを使用している他の開発者からデータベースをインポートしており、毎回すべて問題ありませんでした。

4

2 に答える 2

6

バグ レポート #55897は、これが仕様によるものであり、テーブルの制限にInnoDB記載されていることを示唆しています。

Windows では、InnoDBデータベース名とテーブル名を常に小文字で内部的に格納します。

MySQL の大文字と小文字を区別しない制約名も参照してください。

于 2012-09-15T11:48:49.980 に答える
4

OSX サーバーの my.cnf で MySQL の 2 つの変数を調べる必要があります。

lower_case_table_namesに関する MySQL ドキュメントによると

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

lower_case_table_names上記の抜粋は MyISAM に言及していますが、OSXのデフォルト値が与えられた場合、MySQL が InnoDB で何をジャンプするかを推測することしかできません。これに照らして、OSX の my.cnf がある場合、lower_case_table_names=0またはその中にある場合lower_case_table_names=1、mysqld はおそらく少し混乱しています。

したがって、CentOS に移動した OSX サーバーからの mysqldump が状況を変えなくても驚かないでください。

これはおそらくあなたが今戦っているものです。

于 2012-09-28T21:13:43.943 に答える