2009-12-21 136 views
49

我正在尝试通过最常用的数据库找到relate column types的一些方法:MySQL,PostgreSQLSQLite比较MySQL,PostgreSQL和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 
+0

我会说,我认为这是事实,不建议使用数据库类型的交叉映射,因为(在我的眼中)绝对没有时间需要交叉映射。可能发生的情况是,您必须将PG转换为My,而不是将它们交叉映射。 – 2009-12-21 21:41:15

+0

为什么不将SQL Server和Oracle添加到表中? – 2009-12-21 21:46:43

+2

这种列类型交叉映射的目标是使这三种类型之间的CREATE TABLE定义更容易解释(甚至使用)。由于他们经常使用,我发现开源代码需要为其中的任何一个做好准备。 – Xeoncross 2009-12-21 22:02:26

回答

11

列表:

MEDIUMINT在MySQL是一个奇怪的鸭子(3个字节)。我会避免它,但否则将其映射到INTEGER。

MySQL BOOLEAN(别名BOOL,别名TINYINT(1))与pg布尔类型不兼容。您可能也可能无法移动应用程序,具体取决于它们用作布尔文字。在MySQL中,TRUE和FALSE映射到1和0整数值。它看起来像pg BOOLEAN类型使用字符串文字符号。所以应用程序可能会或可能不会是可移植的 - 至少它没有替代品的下降。

最后,在你的TABL最后一行我觉得SQLite的短语应改为:

INTEGER PRIMARY KEY AUTOINCREMENT 

这大致相当于

BIGINT PRIMARY KEY AUTO_INCREMENT 
在MySQL

。 Postgres里,串行数据类型导致一个INTEGER列,这将大致相同MySQL的

INTEGER PRIMARY KEY AUTO_INCREMENT 

Postgres的也有BIGSERIAL类型,这是一样的SERIAL但有BIGINT类型,而不是INT类型。

我错过了什么:

我缺少INTEGER(化名INT)为MySQL。它可以与INTEGER进行比较。 非常重要的遗漏: VARCHAR和CHAR。从语义上讲,MySQL和PG中的VARCHAR和MySQL和PG中的CHAR是相同的,但在MySQL中,这些类型的最大长度要短得多。在MySQL中,这些类型的最大值可能小于64kb,以1gb(字节)为单位。实际长度说明符以字符数表示,所以如果您有多字节字符集,则必须将最大长度除以最大字符数以获得为该字符集指定的理论最大长度。 SQLite中,VARCHAR和CHAR都映射到TEXT

在MySQL和PG的比特的数据类型有大致相同的语义,但是在MySQL的BIT数据类型的最大长度为64(比特)

我认为MySQL VARBINARY数据类型与PG的BYTEA数据类型最为相似。 (但确实是MySQL的BLOB类型也映射到)

在MySQL中,FLOAT类型应该是等同于Postgres的REAL(和REAL SQLite中太) 在MySQL十进制类型等同于Postgres的十进制,除了在postgres,这种类型不会对精度造成任何限制,而在MySQL中,最大精度是(我相信)70.(即70个数字位置) 对于MySQL和Postgres,NUMERIC都是DECIMAL类型的别名。

+0

还有另一个区别,在Pg中,当你有合理的理由调用它提供的约束时,你只能使用varchar()。在MySQL中,您可以拥有一个快速运行的大型内部内联块。在Pg中它运行得更慢,并占用了我的房间。在Pg中,你几乎不会使用varchar()。 – 2010-01-07 21:49:05

+4

EvanCarrol,这很有趣。那么在pg中应该用什么来存储相当小的文本,如人名,产品名称,简短(比如说少于255)的描述?只是TEXT? – 2010-01-07 21:57:55

+3

postgres布尔值不是字符串文字类型,他们只是看起来这样。如果将它们转换为整数,则将o,1或NULL作为适当值,相反,如果您有0,1或NULL整数,则可以将它们转换为布尔值。 COPY ... FROM接受数字,但INSERT需要明确的转换或引号。所以'0',cast(0作为boolen),'f'和false都将在期望布尔值的插入中工作。 – user340140 2013-08-06 04:21:11