読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

情報スキーマ-列名の取得

以下のエントリで、識別子の大文字/小文字について触れた。
識別子の大文字と小文字の違い - 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の場合で、大文字/小文字の区別はないのだが、情報スキーマ上では指定したそのままの形で保持されている。