Edited at

Windows上でMySQLのlower_case_table_namesにハマる

先に結論書きますと、開発と本番の環境は極力合わせた方が良い事に尽きます。

Windows上で単体検証まで完了し、Linux(AWS)にソースをデプロイするも特定機能が動作せず。

調べてみるとDB処理に不具合があり、ログ上にはテーブルが存在しない旨が出力されていました。

RDS上で確かにテーブル作られてるし、向き先やポート番号等なども間違いない。

色々試行錯誤してMySQL周りの設定にハマっていたことに気付きました。


lower_case_table_names

MySQLではlower_case_table_namesという設定パラメータがあります。

これはテーブル名の大文字小文字を区別するかどうかの設定を行うものです。

以下ブログが詳細を書いてくれてますが、どうやらWindowsはデフォルト1が設定。

この状態ではSQL文でテーブル名を大文字にしても、作られるテーブルは小文字に丸められます。

MySQL の lower_case_table_namesについて,テーブル名とデータベース名の中の大文字小文字について

ちなみに現場のLinux環境は設定値が1ではなく、SQL通りに大文字でテーブルが作られていたので、Linux環境にデプロイすると急に動かなくなっていたようです。

マニアックな設定周りで変な時間を取られない為に、単一プラットフォーム上での開発に統一すればよいのですが、まだまだ現場によってはWindows派が多かったりします。

各々で気をつけるしかないですね。


あれ!? MySQLの設定値が反映されない

原因がMySQLであることが分かったので、試しにローカル環境で設定を変更して、本当に大文字でテーブルが作られるか確認しようとするも、MySQL再起動しても何故か設定反映されず(涙)

結果から言いますと、Windows Vista以降に導入されたVirtualStoreの仕組みに今更躓いてました。

ファイルに対して書き込み権限が無いと、エラーを出す代わりに以下にファイルを書き出す仕様らしい。

C:\Users\ユーザ名\AppData\Local\VirtualStore

今回慣れないwindows10での作業(管理者権限でない)でしたが、Windows7(管理者権限での作業)は使い慣れていたので、まさかこんな問題に直面するなんて思いもせず、完全にスルーしてましたね(反省)

C:\Users\ユーザ名\AppData\Local\VirtualStore配下に作られたファイルを正規の場所に置こうとすると、アラートが出ますがOKボタン押して再起動すると無事に反映されました。

lower_case_table_namesを2にするとSQL通りに大文字で作られ無事解決。