IntelliJ には Database Tools があり、テーブルの閲覧や操作ができ、大変便利です。
私がこの Database Tools を使っていて最近見つけた不具合らしきものを共有します。
利用DBはMySQLです。AWSのRDSのMySQLを使っています。
MySQL のバージョンは 5.5.20
です。
サンプルとして以下のようなテーブルを作成してみました。さまざまな型を含むテーブルとなります。
CREATE TABLE type_test (
ID INT unsigned NOT NULL AUTO_INCREMENT,
A1 TINYINT,
A2 SMALLINT,
A3 MEDIUMINT,
A4 INT,
A5 BIGINT,
A6 FLOAT,
A7 REAL,
A8 DOUBLE PRECISION,
B1 DATETIME,
B2 DATE,
B3 TIMESTAMP,
B4 TIME,
B5 YEAR,
C1 CHAR(1),
C2 VARCHAR(1),
D1 BINARY,
D2 VARBINARY(1),
E1 TINYBLOB,
E2 BLOB,
E3 MEDIUMBLOB,
E4 LONGBLOB,
F1 TINYTEXT,
F2 TEXT,
F3 MEDIUMTEXT,
F4 LONGTEXT,
G1 ENUM('1', '2'),
H1 SET('one', 'two'),
PRIMARY KEY (ID)
) ENGINE=InnoDB
Database Tools ではテーブルのツリービューからテーブルを右クリック選択して表示されるコンテキストメニューにCopy DDL
という項目があります。その名のとおりDDLをクリップボードにコピーしてくれる機能です。
実際に上記DDLでつくったテーブルを選択し、Copy DDL
実行後に貼り付けてみると、上記のDDLと比べて 型が正確でないケースがあることがわかります(コメントの部分です)。
CREATE TABLE type_test
(
ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
A1 TINYINT,
A2 SMALLINT,
A3 MEDIUMINT,
A4 INT,
A5 BIGINT,
A6 REAL, -- 本当は FLOAT型
A7 DOUBLE, -- ここは問題ないっぽい(REALとDOUBLEは同義)
A8 DOUBLE,
B1 DATETIME,
B2 DATE,
B3 TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
B4 TIME,
B5 DATE, -- 本当は YEAR型
C1 CHAR(1),
C2 VARCHAR(1),
D1 BINARY(1),
D2 VARBINARY(1),
E1 TINYBLOB,
E2 LONGBLOB, -- 本当は BLOB型
E3 MEDIUMBLOB,
E4 LONGBLOB,
F1 VARCHAR(255), -- 本当は TINYTEXT型
F2 LONGTEXT, -- 本当は TEXT型
F3 LONGTEXT, -- 本当は MEDIUMTEXT 型
F4 LONGTEXT,
G1 CHAR(2), -- 本当は ENUM 型
H1 CHAR(7) -- 本当は SET 型
);
tinytext
は格納できるサイズが 255 byte なので、まあ同じようなものに見えますが、varchar
と text
ではマルチバイトの扱いに差があるようです。(詳しくは http://ngyuki.hatenablog.com/entry/20110804/p1)
text
や blob
のように 格納できるデータのサイズが大幅に異なる ような型に対して誤表示があるため注意が必要です。
こちらの表示も同様ですね。
この不具合が修正されるまでは、面倒ですが、
show create table table_name
というクエリを発行し、データ型を確認するのがよいと思います。型を見ずにカラム名だけを確認する場合はCopy DDL
を使ってもよいと思います。
この不具合を確認した IntelliJ のバージョンは 12.1.6
ですが、最新の 13
でも同様の現象が発生するようです。
みなさんも注意しましょう。
そしてもし関係者の方がご覧になっていたら、修正をお願いします。
追記
本家にちゃんとバグレポートをしろとお叱りをいただきましたので、レポートいたしました。
http://youtrack.jetbrains.com/issue/IDEA-118246