以下のエントリで、識別子の大文字/小文字について触れた。
識別子の大文字と小文字の違い - HHeLiBeXの日記 正道編
で、列名の情報がどう格納されているのかについてまとめてみる。
実行してみるクエリは、各DBMSについて以下のようなものになる。
- 表の生成:列名情報を取得する対象のテーブルの生成
- 列名情報取得
- 後始末:生成した表の消去
表の生成と後始末は各DBMSで共通。(MySQLではエラーになるものもあるが、実害はないので気にしないことにする。)
CREATE TABLE HOGE1(val1 INT) ; CREATE TABLE HOGE2(VAL2 INT) ; CREATE TABLE HOGE3("val3" INT) ; CREATE TABLE HOGE4("VAL4" INT) ;
DROP TABLE HOGE4 ; DROP TABLE HOGE3 ; DROP TABLE HOGE2 ; DROP TABLE HOGE1 ;
列名情報取得は各DBMSごとに異なる。
PostgreSQL(v8.3), MySQL(v5.1)
SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME IN ('hoge1', 'HOGE1', 'hoge2', 'HOGE2', 'hoge3', 'HOGE3', 'hoge4', 'HOGE4') ;
DB2(v9.7)
SELECT TABLE_NAME, COLUMN_NAME FROM SYSIBM.COLUMNS WHERE TABLE_NAME IN ('hoge1', 'HOGE1', 'hoge2', 'HOGE2', 'hoge3', 'HOGE3', 'hoge4', 'HOGE4') ;
Oracle(10g)
SELECT TABLE_NAME, COLUMN_NAME FROM all_tab_columns WHERE TABLE_NAME IN ('hoge1', 'HOGE1', 'hoge2', 'HOGE2', 'hoge3', 'HOGE3', 'hoge4', 'HOGE4') ;
Firebird(v2.1)
SELECT RDB$RELATION_NAME AS TABLE_NAME, RDB$FIELD_NAME AS COLUMN_NAME FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME IN ('hoge1', 'HOGE1', 'hoge2', 'HOGE2', 'hoge3', 'HOGE3', 'hoge4', 'HOGE4') ;
実行結果は次のとおり。
DB2 Express-C(v9.7)
TABLE_NAME | COLUMN_NAME | |
1 | HOGE1 | VAL1 |
2 | HOGE2 | VAL2 |
3 | HOGE3 | val3 |
4 | HOGE4 | VAL4 |
Oracle Database Express Edition(10g)
TABLE_NAME | COLUMN_NAME | |
1 | HOGE1 | VAL1 |
2 | HOGE2 | VAL2 |
3 | HOGE3 | val3 |
4 | HOGE4 | VAL4 |
PostgreSQL(v8.3)
table_name | column_name | |
1 | hoge1 | val1 |
2 | hoge2 | val2 |
3 | hoge3 | val3 |
4 | hoge4 | VAL4 |
MySQL(v5.1)
TABLE_NAME | COLUMN_NAME | |
1 | hoge1 | val1 |
2 | hoge2 | VAL2 |
Firebird(v2.1)
TABLE_NAME | COLUMN_NAME | |
1 | HOGE1 | VAL1 |
2 | HOGE2 | VAL2 |
3 | HOGE3 | val3 |
4 | HOGE4 | VAL4 |
PostgreSQLでは、ダブルクォートで括らない形で列名を指定した場合には小文字で列名が保持されることがわかる。意外だったのが、MySQLの場合で、大文字/小文字の区別はないのだが、情報スキーマ上では指定したそのままの形で保持されている。