web-dev-qa-db-ja.com

MySQL、PostgreSQL、およびSQLiteのデータベース列タイプの比較? (クロスマッピング)

私は 列の種類を関連付ける に最もよく使用されるデータベース全体で MySQLPostgreSQL 、および SQLite

ここに私がこれまでに持っているものがありますが、私はそれが完了していないのではないかと思います。

MySQL                   PostgreSQL          SQLite

TINYINT                 SMALLINT            INTEGER
SMALLINT                SMALLINT
MEDIUMINT               INTEGER
BIGINT                  BIGINT
BIT                     BIT                 INTEGER
_______________________________________________________

TINYINT UNSIGNED        SMALLINT            INTEGER
SMALLINT UNSIGNED       INTEGER
MEDIUMINT UNSIGNED      INTEGER
INT UNSIGNED            BIGINT
BIGINT UNSIGNED         NUMERIC(20)
_______________________________________________________

DOUBLE                  DOUBLE PRECISION    REAL
FLOAT                   REAL                REAL
DECIMAL                 DECIMAL             REAL
NUMERIC                 NUMERIC             REAL
_______________________________________________________

BOOLEAN                 BOOLEAN             INTEGER
_______________________________________________________

DATE                    DATE                TEXT
TIME                    TIME
DATETIME                TIMESTAMP
_______________________________________________________

TIMESTAMP DEFAULT       TIMESTAMP DEFAULT   TEXT
NOW()                   NOW()   
_______________________________________________________

LONGTEXT                TEXT                TEXT
MEDIUMTEXT              TEXT                TEXT
BLOB                    BYTEA               BLOB
VARCHAR                 VARCHAR             TEXT
CHAR                    CHAR                TEXT
_______________________________________________________

columnname INT          columnname SERIAL   INTEGER PRIMARY 
AUTO_INCREMENT                              KEY AUTOINCREMENT
64
Xeoncross

私が違うやり方をすることのリスト:

MySQLのMEDIUMINTは奇妙なアヒル(3バイト)です。私はそれを避けますが、それ以外の場合はINTEGERにもマップします。

MySQL BOOLEAN(エイリアスBOOL、エイリアスTINYINT(1))は、pgブール型と互換性がありません。ブールリテラルとして使用するものに応じて、アプリを移植できる場合とできない場合があります。 MySQLでは、TRUEおよびFALSEは1および0の整数値にマッピングされます。 pg BOOLEAN型は文字列リテラル表記を使用しているようです。そのため、アプリは移植性がある場合とそうでない場合があります-少なくとも差し替えはありません。

最後に、タブの最後の行については、SQLiteフレーズは次のようになっていると思います。

INTEGER PRIMARY KEY AUTOINCREMENT

これはおおよそ次と同等です

BIGINT PRIMARY KEY AUTO_INCREMENT

mySQLで。 postgresでは、SERIALデータ型の結果はINTEGER列になり、これはMySQLのデータ型とほぼ同じになります

INTEGER PRIMARY KEY AUTO_INCREMENT

PostgresにはBIGSERIAL型もあります。これはSERIALと同じですが、INT型ではなくBIGINT型です。

私が見逃したもの:

MySQLのINTEGER(エイリアスINT)がありません。 pgのINTEGERに匹敵します。非常に重要な省略:VARCHARおよびCHAR。意味的には、MySQLとPGのVARCHAR、およびMySQLとPGのCHARは同じですが、MySQLではこれらの型の最大長ははるかに短くなっています。 MySQLでは、これらのタイプは最大で64 kb未満(pg 1 Gb(バイト))になります。実際の長さ指定子は文字数で表されるため、マルチバイト文字セットがある場合、その文字セットに指定されている理論上の最大長を取得するには、最大文字数で最大長を除算する必要があります。 SQLiteでは、VARCHARとCHARの両方がTEXTにマップされます

MySQLとPGのBITデータ型のセマンティクスはほぼ同じですが、MySQLではBITデータ型の最大長は64(ビット)です

MySQL VARBINARYデータ型はPGのBYTEAデータ型に最も匹敵すると思います。 (実際、MySQLのBLOB型もそれにマッピングされます)

MySQLのFLOAT型は、postgresのREAL(およびSQLiteのREAL)と同等でなければなりません。MySQLのDECIMAL型は、postgresのDECIMALと同等です。 MySQLの最大精度は(私は信じます)70です(つまり、70の数字位置)。MySQLとPostgresの両方で、NUMERICはDECIMALタイプのエイリアスです。

15
Roland Bouman