SYSTEM238 / NOTES1 / データベース / データ型の比較と互換(PostgreSQL, MySQL)

NOTES1 PROG1
データ型の比較と互換(PostgreSQL, MySQL)
データ型の比較と互換のノート。対象はPostgreSQL8.1.x以降とMySQL5.1.x

主なデータ型だけ記述してます。
(個人的に)あまり使わないデータ型は省略しています。

各データベースのデータ型については PostgreSQLのデータ型MySQLのデータ型 を参照してください。

数値型

属性 PostgreSQL MySQL 備考
整数 SMALLINT SMALLINT MySQLのUNSIGNEDオプションはPostgreSQLでは1つ上の型を選択して対応する。
例) INT UNSIGNED → BIGINT
INTEGER INT
BIGINT BIGINT
ユーザ指定精度 DECIMAL
NUMERIC
DECIMAL
NUMERIC
DEC
MySQLのDECは使わない。
浮動小数点数 REAL FLOAT PostgreSQLのREALは4Byte、MySQLのREALは8Byteなので注意する事。

それから実用上は問題ないと思うけど数値範囲が微妙に違うのでこれにも注意する事。
DOUBLE PRECI… DOUBLE
REAL
その他 SERIAL -- PostgreSQLのSERIAL型は対応する整数型のカラムにAUTO_INCREMENTを設定して対応する。

文字列型

属性 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、そうでない場合はなんか考える。

*1 MySQLのTEXT型にインデックスを設定する場合は長さの指定が必要になる。

CREATE TABLE fuga_tbl (uho_col TEXT);
CREATE INDEX hoge_idx ON fuga_tbl (uho_col(10));

日付/時刻型

属性 PostgreSQL MySQL 備考
日付 DATE DATE
日時 TIMESTAMP TIMESTAMP
DATETIME
MySQLのTIMESTAMPは最初のカラムに"CURRENT TIMESTAMP ON UPDATE CURRENT 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では格納できる範囲が違う事に留意する。

ブーリアン/ビット型

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

参考


PostgreSQL全機能バイブル
MySQL全機能バイブル ~現場で役立つAtoZ~

MySQLとPostgreSQLのリファレンス本はこの本を入手しておけば間違いないと思います。お薦めです!!