MySQLのカラム名テーブル名の大文字小文字

PostgreSQLだとカラムやテーブルの名前は小文字に揃えられるが、MySQLでは CREATE TABLE で書いた通りに保持されている模様。

mysql> CREATE TABLE table1 ( name1 VARCHAR(10), NAME2 VARCHAR(10) );
Query OK, 0 rows affected (0.08 sec)

mysql> SHOW CREATE TABLE table1;
+--------+-------------------------------
| Table  | Create Table                                                                                                                        |
+--------+-------------------------------
| table1 | CREATE TABLE `table1` (
  `name1` varchar(10) DEFAULT NULL,
  `NAME2` varchar(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+--------+-------------------------------
1 row in set (0.00 sec)

SQLカラム名の指定は大文字小文字を問わないが、テーブル名は大文字小文字を区別するみたい。

mysql> INSERT INTO table1 (name1, name2) VALUES('きりさめ','まりさ');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM table1;
+--------------+-----------+
| name1        | NAME2     |
+--------------+-----------+
| きりさめ     | まりさ    |
+--------------+-----------+
1 row in set (0.00 sec)

mysql> SELECT * FROM table1 WHERE name2 LIKE 'ま%';
+--------------+-----------+
| name1        | NAME2     |
+--------------+-----------+
| きりさめ     | まりさ    |
+--------------+-----------+
1 row in set (0.00 sec)

mysql> SELECT name1, name2 FROM table1;
+--------------+-----------+
| name1        | name2     |
+--------------+-----------+
| きりさめ     | まりさ    |
+--------------+-----------+
1 row in set (0.00 sec)

テーブル名を大文字で書いたらそんなのないって怒られた。

mysql> SELECT * FROM TABLE1;
ERROR 1146 (42S02): Table 'test1.TABLE1' doesn't exist

8.2.2. 識別子の大文字/小文字区別
http://dev.mysql.com/doc/refman/5.1/ja/identifier-case-sensitivity.html

を見ると、lower_case_table_namesシステム変数を1に設定すれば、テーブル名が小文字に揃って、PostgreSQLと同じ使い勝手になりそう。

テーブル名はディスク上に小文字で記憶され、名前比較では大文字小文字は区別されません。MySQLでは、保管およびルックアップ時に全てのテーブル名が小文字に変換されます。このオプションはデータベース名やテーブルエイリアスにも適用されます。