比较MySQL,PostgreSQL和SQLite中的数据库列类型?(跨图)


77

我正在尝试找到一种在最常用的数据库之间关联列类型的方法:MySQLPostgreSQLSQLite

这是到目前为止的内容,但恐怕还没有完成,我需要一些经验丰富的人来帮助我完成所有遗漏的类型。

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

我会说,我认为这是事实,不建议对数据库类型进行交叉映射,因为(在我看来)绝对没有时间进行交叉映射。您可能必须将PG转换为My,而不必交叉映射它们。
朱利叶斯F 2009年

2
为什么不将SQL Server和Oracle添加到表中?
德鲁·霍尔

2
此列类型的交叉图的目的是使解释(甚至使用)CREATE TABLE这三种类型之间的定义变得更加容易。由于它们经常被使用,我发现开源代码需要为它们中的任何一个做好准备。
Xeoncross

@Xeoncross,也许您可​​以根据我的建议更新图表?尤其是 缺少的INTEGER,VARCHAR,CHAR内容需要添加。我认为我的其他建议也有效,但并不那么重要。
罗兰·鲍曼

@Roland,对圣诞节感到抱歉,我一直都很忙。固定。
Xeoncross

Answers:


16

我会做不同的事情清单:

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相同,但是具有BIGINT类型而不是INT类型。

我错过了什么:

我缺少MySQL的INTEGER(别名INT)。它可与pg中的INTEGER相提并论。非常重要的遗漏:VARCHAR和CHAR。从语义上讲,MySQL和PG中的VARCHAR以及MySQL和PG中的CHAR是相同的,但是在MySQL中,这些类型的最大长度要短得多。在MySQL中,这些类型的最大长度不能超过64kb,以pg 1Gb(字节)为单位。实际的长度说明符以字符数表示,因此,如果您有多字节字符集,则必须将最大长度除以最大字符数,以获得为该字符集指定的理论最大长度。在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,除了在postgres中,该类型不会对精度施加任何限制,而在MySQL的最大精度为(我认为)70。(即70个数字位置)对于MySQL和Postgres而言,NUMERIC是DECIMAL类型的别名。


还有另一个区别,在Pg中,只有在有合理的理由调用它提供的约束时,才使用varchar()。在MySQL中,这样做是为了使内部有大量内联文本大块快速运行。在Pg中,它运行速度较慢,并且占用了我的房间。在Pg中,您几乎永远不会使用varchar()。
埃文·卡罗尔

5
EvanCarrol,这很有趣。那么在pg中应该使用什么来存储相当小的文本,例如人名,产品名,简短的描述(例如,少于255个)?只是TEXT?
罗兰·鲍曼

3
postgres布尔值不是字符串文字类型,它们只是那样看。如果将它们强制转换为整数,则将o,1或NULL适当地转换为整数,相反,如果您将0,1或NULL整数转换为布尔值,则可以将它们强制转换为布尔值。COPY ... FROM接受数字,但是INSERT需要显式强制转换或在数字周围加引号。所以'0',强制转换(0为boolen),'f'和false都可以在期望布尔值的插入中使用。
user340140 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.