MySQLにおける大文字と小文字の区別

ここ
の焼きまわしです。より正確な詳細はリンクを参照してください。

OSごとに違う点

windows

windowsのファイルシステムと同様に、windowsで動作する
mysqlはデータベース名とテーブル名の大文字小文字を区別しません。

以下はwindowsで動作するmysql上では同義になります。

UnixとUFSファイルシステムのMacOSXの場合

UnixやLinuxベースのほとんどのOSはファイルシステムで大文字小文字を区別します。
これらと同様にmysqlのデータベース名、テーブル名も区別します。

以下のSQLはそれぞれ違う意味をもって実行されます。

Unixと同様の挙動をします。

HFS+ファイルシステム(MacOSXのデフォルト)のMacOSX

MacOSXのデフォルトで使用されているHFS+というファイルシステムでは
MySqlの大文字小文字は区別されません。

データベースとテーブルに関して、windowsと同じ挙動になります。

注意

大文字小文字を区別しない環境であっても、同一ステートメント内で
違う表記をすると動作しません。

カラム名、インデックス名

これはどの環境でも大文字小文字区別しない。
加えて、インデックスされたルーチンやカラムのエイリアスも大文字小文字を
区別しません。

テーブルのエイリアスについて

この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)
    1. CREATE TABLE, CREATE DATABASEしたときにステートメントに書かれた大文字と小文字をそのまま利用します。
    2. SQLを記述するときも大文字小文字が区別されます。
  • lower_case_table_names=1(Windows)
    1. CREATE TABLE, CREATE DATABASEしたときは、大文字小文字 を区別せず全て小文字で作成される
    2. 保存・検索もステートメント内の大文字小文字は全て小文字で利用される
  • lower_case_table_names=2(MacOSX)
    1. CREATE TABLE, CREATE DATABASEしたときにステートメントに書かれた大文字と小文字をそのまま利用します
    2. 参照時は全て小文字で検索され、大文字小文字を区別しません。

複数種類の環境でステートメントを統一するための解決策1

lower_case_table_names=1そ全てのシステムで採用する。
これのデメリットは、CREATE TABLE, CREATE DATABASEの
もともとの大文字小文字の区別が見えなくなること。

複数種類の環境でステートメントを統一するための解決策2

Unixではlower_case_table_names=0を
Windowsではlower_case_table_names=2を
利用する。

これによって、全システムで大文字小文字を
分けて利用することができる

デメリットはWindowsで書かれたステートメントが
大文字小文字が正しく書かれているかをチェックする
必要が出てくる。

これが、windowsデフォルトのlower_case_table_names=1だと
userとdivisionというテーブルが作成されてしまうが
lower_case_table_names=2にすることによって、Userとdivisionという
大文字小文字を区別する状態で、CREATE TABLEすることができるようになります。

僕の考察

個人的には解決策1を推したい。
(ちょっとぐぐったところ、1の解決策で対応している人がほとんど)

次の課題として、InnoDBとかMyISAMとかデータベースエンジンの
主要なものをちょっと調べたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です