はじめに
※別のブログに投稿していた記事をQiitaに投稿し直しています。(元の記事は削除予定)
エラー発生までの流れ
- Macでdocker-composeを使ってMySQL環境を構築
- CREATE TABLE XXX
- DROP TABLE XXX
- CREATE TABLE XXX でエラー発生
Table ‘xxx’ doesn't exist
いや、無いから作ろうとしているのに、無いよって。
よく見るとテーブル名が小文字になっている。
ググってみると、lower_case_table_namesというパラメータで回避できそう。
lower_case_table_namesについて
値 | 意味 |
---|---|
0 | テーブル名とデータベース名は、CREATE TABLE または CREATE DATABASE ステートメントで指定された大文字または小文字を使用してディスク上に格納されます。名前比較では大文字と小文字が区別されます。大文字小文字を区別しないファイル名を持つシステム (Windows や OS X など) で MySQL を実行する場合、この変数を 0 に設定しないでください。大文字と小文字を区別しないファイルシステムで --lower-case-table-names=0 を使用して強制的にこの変数を 0 に設定し、大文字と小文字を変えて MyISAM テーブル名にアクセスした場合、インデックスが破損することがあります。 |
1 | テーブル名はディスク上に小文字で格納され、名前比較では大文字と小文字は区別されません。MySQL では、保存およびルックアップ時にすべてのテーブル名が小文字に変換されます。この動作はデータベース名やテーブルエイリアスにも適用されます。 |
2 | テーブル名とデータベース名は、CREATE TABLE または CREATE DATABASE ステートメントで指定された大文字または小文字を使用してディスク上に格納されますが、MySQL ではルックアップ時に小文字に変換されます。名前比較では大文字と小文字が区別されません。これは大文字と小文字が区別されないファイルシステムでのみ機能します。InnoDB テーブル名は lower_case_table_names=1 のように、小文字で格納されます。 |
デフォルト値はUnixは0, Windowsは1, OS Xは2で、0を設定すれば解決しそう。
lower_case_table_namesを設定、再びエラー
docker-composeのymlファイルに下記を追加
command: --lower_case_table_names=0
追加後にコンテナを再起動したらエラー発生
[ERROR] The server option 'lower_case_table_names' is configured to use case sensitive table names but the data directory is on a case-insensitive file system which is an unsupported combination. Please consider either using a case sensitive file system for your data directory or switching to a case-insensitive table name mode.
ファイルシステムが大文字小文字を区別していないらしい。
ディスクユーティリティで確認すると「APFS」で、大文字小文字は区別しない。
ディスクの初期化は面倒臭い。。
対処
大したテーブル、データは入っていないので、ボリュームを削除し、コンテナを再作成。
初回のCREATE TABLEはエラーになっていないので、DROP TABLEで完全に消えていないのかも。
気が向いたらこの辺り調べてみる。。