PostgreSQLとMySQLのデータ型比較と互換性を調べた

1. 数値型

属性 PostgreSQL MySQL 備考
整数 SMALLINT SMALLINT MySQLのUNSIGNEDオプションはPostgreSQLでは上位の型を選択して対応する。
例) INT UNSIGNED → BIGINT
INTEGER INT
BIGINT BIGINT
ユーザ指定精度 DECIMAL
NUMERIC
DECIMAL
NUMERIC
DEC
MySQLのDECは使わない。
浮動小数点数 REAL FLOAT ・PostgreSQLのREALは4Byte、MySQLのREALは8Byteなので注意。
・実用上は問題ないと思うけど数値範囲が微妙に違うのでこれにも注意する事。
DOUBLE DOUBLE
REAL
その他 SERIAL -- PostgreSQLのSERIAL型はMySQLではAUTO_INCREMENTを設定して対応する。

2. 文字列型

属性 PostgreSQL MySQL 備考
固定長 CHAR(n)
CHARACTER(n)
CHAR(n)
CHARACTER(n)
CHAR CHAR
可変長 VARCHAR(n) VARCHAR(n)
TEXT TEXT *1 ・MySQLのTINYTEXT、MEDIUMTEXTはPostgreSQLのTEXTに割当てる。
・MySQLのLONGTEXT(4GB)はPostgreSQLのTEXT(約1GB)で足りるならTEXT、そうでない場合はなんか考える。
・MySQLのTEXT型にインデックスを設定する場合は長さの指定が必要になる。 *1
-- *1
CREATE TABLE fuga_tbl (uho_col TEXT);
CREATE INDEX hoge_idx ON fuga_tbl (uho_col(10));

3. 日付/時刻型

属性 PostgreSQL MySQL 備考
日付 DATE DATE
日時 TIMESTAMP TIMESTAMP
DATETIME
・MySQLのTIMESTAMPは何かと問題が多いので使わない。
・PostgreSQLのTIMESTAMPはMySQLではDATETIMEだと思っていた方が問題が少ないと思う。
・MySQLでタイムゾーンを扱うのはなんか面倒くさそう。
時刻 TIME TIME ・時刻範囲の考え方が違うので注意する。
PostgreSQL'00:00:00.00' ~ '23:59:59.99'
MySQL-838:59:59' ~ '838:59:59'
・MySQLでタイムゾーンを扱うのはなんか面倒くさそう。
・大抵の場合は問題にならないと思うが、日付/時刻型はPostgreSQLとMySQLでは格納できる範囲が違う事に留意する。

4. ブーリアン型/ビット型

属性 PostgreSQL MySQL 備考
固定長ビット BIT(n) BIT(n)
BIT BIT
ブーリアン BOOLEAN BOOLEAN ・PostgreSQLはTRUE/FALSE, 't'/'f', 0/1などで真理値を示す。
・MySQLはTINYINT(1)と等価なので数値で真理値を示す。(0 / 1)

6. 参考