ここ
の焼きまわしです。より正確な詳細はリンクを参照してください。
OSごとに違う点
windows
windowsのファイルシステムと同様に、windowsで動作する
mysqlはデータベース名とテーブル名の大文字小文字を区別しません。
以下はwindowsで動作するmysql上では同義になります。
1 2 |
use sample_db; use SAMPLE_DB; |
1 2 3 |
select * from User; select * from USER; select * from user; |
UnixとUFSファイルシステムのMacOSXの場合
UnixやLinuxベースのほとんどのOSはファイルシステムで大文字小文字を区別します。
これらと同様にmysqlのデータベース名、テーブル名も区別します。
以下のSQLはそれぞれ違う意味をもって実行されます。
1 2 3 |
-- sample_dbとSAMPLE_DBは違うデータベース use sample_db; use SAMPLE_DB; |
1 2 3 4 |
-- User,USER,userは全て違うテーブル select * from User; select * from USER; select * from user; |
Unixと同様の挙動をします。
HFS+ファイルシステム(MacOSXのデフォルト)のMacOSX
MacOSXのデフォルトで使用されているHFS+というファイルシステムでは
MySqlの大文字小文字は区別されません。
データベースとテーブルに関して、windowsと同じ挙動になります。
注意
大文字小文字を区別しない環境であっても、同一ステートメント内で
違う表記をすると動作しません。
1 2 |
-- 悪い例です SELECT * FROM User Where user.id != 0; |
カラム名、インデックス名
これはどの環境でも大文字小文字区別しない。
加えて、インデックスされたルーチンやカラムのエイリアスも大文字小文字を
区別しません。
テーブルのエイリアスについて
1 2 3 4 5 6 |
SELECT col_name FROM tbl_name AS a WHERE a.col_name = 1 OR A.col_name = 2; |
このSQLは
大文字小文字を区別しないシステム(Windows)ではtbl_nameは
エイリアスAまたはaで検索されるため動作するが
Unixでは大文字小文字を区別するため
動作しません。このように混乱を招くことになるので
テーブルは小文字で作成、参照する等の一貫した
ルールを設けることを公式で推奨しています。
lower_case_table_namesシステム変数
MySQLでのテーブルとデータベース名の保存方法を
制御するための変数。
これを設定することによって各OSの挙動の違いを
吸収することができる。
Unixでは0,Windowsでは1,MacOSXでは2に設定されています。
- lower_case_table_names=0(Unix)
- CREATE TABLE, CREATE DATABASEしたときにステートメントに書かれた大文字と小文字をそのまま利用します。
- SQLを記述するときも大文字小文字が区別されます。
- lower_case_table_names=1(Windows)
- CREATE TABLE, CREATE DATABASEしたときは、大文字小文字 を区別せず全て小文字で作成される
- 保存・検索もステートメント内の大文字小文字は全て小文字で利用される
- lower_case_table_names=2(MacOSX)
- CREATE TABLE, CREATE DATABASEしたときにステートメントに書かれた大文字と小文字をそのまま利用します
- 参照時は全て小文字で検索され、大文字小文字を区別しません。
複数種類の環境でステートメントを統一するための解決策1
lower_case_table_names=1そ全てのシステムで採用する。
これのデメリットは、CREATE TABLE, CREATE DATABASEの
もともとの大文字小文字の区別が見えなくなること。
複数種類の環境でステートメントを統一するための解決策2
Unixではlower_case_table_names=0を
Windowsではlower_case_table_names=2を
利用する。
これによって、全システムで大文字小文字を
分けて利用することができる
デメリットはWindowsで書かれたステートメントが
大文字小文字が正しく書かれているかをチェックする
必要が出てくる。
1 2 |
CREATE TABLE User; CREATE TABLE division; |
これが、windowsデフォルトのlower_case_table_names=1だと
userとdivisionというテーブルが作成されてしまうが
lower_case_table_names=2にすることによって、Userとdivisionという
大文字小文字を区別する状態で、CREATE TABLEすることができるようになります。
僕の考察
個人的には解決策1を推したい。
(ちょっとぐぐったところ、1の解決策で対応している人がほとんど)
次の課題として、InnoDBとかMyISAMとかデータベースエンジンの
主要なものをちょっと調べたい