体系结构概述和对比 在 DB2、MySQL和 PostgreSQL之间有许多差异。我们先看看这三种数据库服务器在基本体系结构方面的一些差异和相似之处。
MySQL和PostgreSQL数据库可以几乎每周都进行特性修改,但是DB2中的特性实现和修改要经过非常仔细的计划,这是因为有众多的业务依赖于使用DB2产品。请注意,在本文中我们使用MySQL 5.1、PostgreSQL8.0.3和 DB2 V8.2进行比较,所以在阅读本文时请考虑到这一点。 图1、图2和 图3是MySQL、PostgreSQL和DB2的体系结构图。我们在阅读一些文档之后竭尽我们的能力绘制出MySQL和 PostgreSQL的体系结构图。如果您发现不符合实际情况的地方,请告诉我们,我们会进行纠正。 MySQL使用一种基于线程的体系结构,而PostgreSQL和 DB2 采用基于进程的体系结构。正如在图1中看到的,一个 MySQL实例可以管理许多数据库。一个实例中的所有MySQL数据库共享一个公用的系统编目,INFORMATION_SCHEMA。 DB2中的数据库是一个单独的实体,有自己的系统编目、表空间、缓冲池等等。DB2实例管理不同的数据库,但是数据库并不共享表空间、日志、系统编目或临时表空间。 具有许多数据库的一个MySQL实例可以看作DB2 中的一个数据库,而每个MySQL数据库相当于DB2 中的一个模式。如果服务器上运行几个MySQL实例,每个实例管理几个数据库,那么可以采用以下迁移方式之一:
注意:当我们提到基于进程的体系结构时,指的是 UNIX®平台,因为 Windows上的模型是基于线程的体系结构。DB2和PostgreSQL 都是这样的。 在一个 DB2连接的范围内只能访问一个数据库资源,而MySQL允许在同一个连接的范围内访问多个数据库资源。 MySQL最有意思的特性之一是可插入的存储引擎。可以选择MyISAM、InnoDB、Archive、Federated、Memory、Merge、Cluster、NDB或Custom存储引擎。每个存储引擎具有不同的性质,可以根据自己的特定需求选择某一存储引擎。对于比较,我们发现InnoDB最接近于关系数据库。 MySQL服务器进程(mysqld)可以创建许多线程:
MySQL使用数据缓存、记录缓存、键缓存、表缓存、主机名缓存和特权缓存来缓存和检索服务器进程中所有线程所使用的不同类型的数据。 另外,MySQL主进程(mysqld)具有用来处理数据库管理活动的线程,比如备份、恢复、并发控制等等。 PostgreSQL实例(见图2)可以管理一个数据库集群。每个数据库有自己的系统编目,INFORMATION_SCHEMA和pg_catalog。所有数据库共享pg_databases作为公用系统表。每个数据库是一个单独的实体,数据库的集合称为集群。一个PostgreSQL实例可以管理一个数据库集群。一台服务器可以运行多个实例。 在逻辑上,PostgreSQL数据库可以迁移到DB2数据库。这两种数据库都支持模式对象类型。不能从命名的连接访问其他数据库。 PostgreSQL和DB2之间最显著的差异与表空间相关。PostgreSQL表空间可以跨越多个数据库,而DB2表空间特定于一个数据库。 PostgreSQL会话由几个主进程组成:
图3显示 DB2 的体系结构。这张图解释了DB2如何使用缓冲池在磁盘之间处理数据(文件、原始设备、目录等等)。DB2使用一个连接集中器来处理大量连接。DB2页清理器和预获取器异步地工作,各个进程单独处理重做日志活动。关于DB2中锁和进程的工作方式的详细描述,请参见参考资料。 DB2会话由几个进程组成:
DB2服务器进程通过称为数据库管理器内存(DatabaseManager Memory)和数据库共享内存(DatabaseShared Memory)的内存区域相互通信,见 图4。 表1对比了 MySQL、PostgreSQL和DB2特性。这不是一个完整的列表,但是对比了最常用的特性。 | ||||||
特性 | MySQL | PostgreSQL | DB2 | |||
---|---|---|---|---|---|---|
实例 | 通过执行 MySQL命令(mysqld)启动实例。一个实例可以管理一个或多个数据库。一台服务器可以运行多个mysqld实例。一个实例管理器可以监视mysqld 的各个实例。 | 通过执行 Postmaster进程(pg_ctl)启动实例。一个实例可以管理一个或多个数据库,这些数据库组成一个集群。集群是磁盘上的一个区域,这个区域在安装时初始化并由一个目录组成,所有数据都存储在这个目录中。使用initdb创建第一个数据库。 | 实例是一个 DB2安装,它管理一个或多个数据库。在安装期间创建一个默认实例。使用db2start命令启动实例。还可以使用db2icrt命令在同一台机器上创建多个实例。在创建数据库本身之前,并不分配数据存储。数据库可以使用原始设备自己管理存储,或使用操作系统文件系统。环境变量DB2INSTANCE决定要连接哪个实例。 | |||
数据库 | 数据库是命名的对象集合,是与实例中的其他数据库分离的实体。一个MySQL实例中的所有数据库共享同一个系统编目。 | 数据库是命名的对象集合,每个数据库是与其他数据库分离的实体。每个数据库有自己的系统编目,但是所有数据库共享pg_databases。 | 数据库是命名的对象集合,是与其他数据库分离的实体。数据库是在物理上和逻辑上独立的实体,不与其他数据库共享任何东西。一个DB2实例可以管理一个或多个数据库。 | |||
数据缓冲区 | 通过 innodb_buffer_pool_size配置参数设置数据缓冲区。这个参数是内存缓冲区的字节数,InnoDB使用这个缓冲区来缓存表的数据和索引。在专用的数据库服务器上,这个参数最高可以设置为机器物理内存量的80%。 | Shared_buffers缓存。在默认情况下分配64个缓冲区。默认的块大小是 8K。可以通过设置postgresql.conf 文件中的shared_buffers 参数来更新缓冲区缓存。 | 在默认情况下分配一个缓冲池,并可以使用CREATE BUFFERPOOL命令添加其他缓冲池。默认的页大小在创建数据库时决定,可以是4、8、16或32K。 | |||
数据库连接 | 客户机使用 CONNECT 或USE语句连接数据库,这时要指定数据库名,还可以指定用户id和密码。使用角色管理数据库中的用户和用户组。 | 客户机使用 connect语句连接数据库,这时要指定数据库名,还可以指定用户id和密码。使用角色管理数据库中的用户和用户组。 | 客户机使用 connect语句连接数据库,这时要指定数据库名,还可以指定用户id和密码。使用操作系统命令在数据库外创建用户和用户组。 | |||
身份验证 | MySQL 在数据库级管理身份验证。 | PostgreSQL 的身份验证取决于主机配置。 | DB2 使用 API通过各种实现(比如 Kerberos、LDAP、ActiveDirectory和 PAM)在操作系统级对用户进行身份验证,它的可插入身份验证体系结构允许插入第三方模块。 | |||
加密 | 可以在表级指定密码来对数据进行加密。还可以使用AES_ENCRYPT和AES_DECRYPT 函数对列数据进行加密和解密。可以通过SSL连接实现网络加密。 | 可以使用 pgcrypto库中的函数对列进行加密/解密。可以通过SSL连接实现网络加密。 | 可以使用 DB2提供的加密和解密方法对列数据进行加密/解密。如果在实例级选择DATA_ENCRYPT身份验证方法,那么可以对客户机和服务器之间的网络通信进行加密。 | |||
审计 | 可以对 querylog 执行grep。 | 可以在表上使用 PL/pgSQL触发器来进行审计。 | DB2 提供的db2audit实用程序可以提供详细的审计,而不需要实现基于触发器或日志的审计。 | |||
查询解释 | 使用 EXPLAIN 命令查看查询的解释计划。 | 使用 EXPLAIN 命令查看查询的解释计划。 | DB2 提供的 GUI和命令行工具可以用来查看查询的解释计划。它还可以从SQL缓存捕获查询并生成解释计划。可以使用工具查看所有存储过程中的SQL的解释计划。 | |||
备份、恢复和日志 | InnoDB使用写前(write-ahead)日志记录。支持在线和离线完全备份以及崩溃和事务恢复。 | 在数据目录的一个子目录中维护写前日志。支持在线和离线完全备份以及崩溃、时间点和事务恢复。 | 使用写前日志记录。支持完全、增量、delta和表空间级在线/离线备份和恢复。支持崩溃、时间点和事务恢复。 | |||
JDBC 驱动程序 | 可以从 参考资料 下载 JDBC驱动程序。 | 可以从 参考资料 下载 JDBC驱动程序。 | 支持 Type-2 和Type-4(Universal)驱动程序。JDBC驱动程序是DB2产品的一部分。 | |||
表类型 | 取决于存储引擎。例如,NDB存储引擎支持分区表,内存引擎支持内存表。 | 支持临时表、常规表以及范围和列表类型的分区表。不支持哈希分区表。 | 支持用户表、临时表、常规表以及范围、哈希和多维簇类型的分区表。 | |||
索引类型 | 取决于存储引擎。MyISAM:BTREE,InnoDB:BTREE。 | 支持 B-树、哈希、R-树和Gist索引。 | 支持 B-树和位图索引。 | |||
约束 | 支持主键、外键、惟一和非空约束。对检查约束进行解析,但是不强制实施。 | 支持主键、外键、惟一、非空和检查约束。 | 支持主键、外键、惟一、非空和检查约束。 | |||
存储过程和用户定义函数 | 支持 CREATE PROCEDURE 和CREATE FUNCTION语句。存储过程可以用SQL 和 C++编写。用户定义函数可以用 SQL、C和C++ 编写。 | 虽然使用术语存储过程,但是只支持 CREATEFUNCTION 语句。用户定义函数可以用PL/pgSQL(专用的过程语言)、SQL和C 编写。 | 支持 CREATE PROCEDURE和CREATE FUNCTION语句。存储过程可以用SQL(SQLPL)、C、Java、COBOL和REXX 编写。用户定义函数可以用SQL(SQLPL)、C和Java 编写。 | |||
触发器 | 支持行前触发器、行后触发器和语句触发器,触发器语句用过程语言复合语句编写。 | 支持行前触发器、行后触发器和语句触发器,触发器过程用C 编写。 | 支持行前触发器、行后和语句触发器、insteadof 触发器和包含 SQLPL 复合语句的触发器。可以从触发器调用存储过程。 | |||
系统配置文件 | my.conf | Postgresql.conf | Database ManagerConfiguration | |||
数据库配置 | my.conf | Postgresql.conf | Database Configuration | |||
客户机连接文件 | my.conf | pg_hba.conf | System DatabaseDirectory | |||
XML 支持 | 有限的 XML 支持。 | 有限的 XML 支持。 | 为访问 XML 数据提供丰富的支持。DB2Viper(V9)是第一个以原生形式存储/检索XML的混合型数据库。 | |||
数据访问和管理服务器 | OPTIMIZE TABLE ——回收未使用的空间并消除数据文件的碎片 | Vacuum ——回收未使用的空间 | Reorg ——用来重新整理数据并消除数据碎片 | |||
并发控制 | 支持表级和行级锁。InnoDB存储引擎支持READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ和SERIALIZABLE。使用SET TRANSACTION ISOLATIONLEVEL语句在事务级设置隔离级别。 | 支持表级和行级锁。支持的 ANSI隔离级别是 ReadCommitted(默认 —— 能看到查询启动时数据库的快照)和Serialization(与Repeatable Read相似—— 只能看到在事务启动之前提交的结果)。使用SET TRANSACTION语句在事务级设置隔离级别。使用SETSESSION 在会话级进行设置。 | 支持表级和行级锁以及 4个隔离级别:RR(可重复读)、RS(读可靠)、CS(默认—— 游标可靠)和 UR(未提交读)。使用SET ISOLATION在会话级、使用WITH 子句在 SQL语句级或使用数据库配置参数在数据库级设置隔离级别。 |
到目前为止,我们已经看到了MySQL、PostgreSQL和DB2在体系结构和特性方面的一些差异。现在就来研究这些数据库服务器在数据类型方面的差异。 MySQL、PostgreSQL和 DB2 之间的数据类型对比 | ||||||||||
数据类型 | 说明 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
BIGINT | 存储有符号或无符号整数,使用 8字节的存储空间。 | |||||||||
BLOB | 存储长度可变的二进制数据,长度最大为 2GB。超过1 GB的长度不进行日志记录。 | |||||||||
CHAR(n) | 存储固定长度的字符数据,长度最大为 254字节。使用 ‘n’字节的存储空间。 | |||||||||
CHAR(n) FOR BIT DATA | 存储固定长度的二进制值。 | |||||||||
CLOB | 存储长度可变的字符数据,长度最大为 2GB。超过1 GB的长度不进行日志记录。 | |||||||||
DATE | 存储日历日期,不包含天内的时间。使用 4字节的存储空间。 | |||||||||
DEC(p,s) | 采用精度(p)1到31 和刻度(s)0到31 来存储数值。使用(p/2) +1字节的存储空间。 | |||||||||
DOUBLE | 存储浮点数,使用 8字节的存储空间。 | |||||||||
FLOAT(p) | 采用精度(p)1到53 来存储数值。如果p <= 24,那么相当于REAL。如果p>= 25,那么相当于 DOUBLEPRECISION。 | |||||||||
GRAPHIC(n) | 用于 National LanguageSupport(NLS)和长度固定的字符串(常常是DBCS),长度最大为127字节。对于双字节字符集,使用n*2 字节的存储空间;对于单字节字符集,使用n字节的存储空间。 | |||||||||
INT | 存储有符号或无符号整数,使用 4字节的存储空间。 | |||||||||
REAL | 存储浮点数,使用 4字节的存储空间。 | |||||||||
SMALLINT | 存储有符号和无符号整数,使用 2字节的存储空间。 | |||||||||
TIME | 存储天内的时间,使用 3字节的存储空间。 | |||||||||
TIMESTAMP | 存储日期(年、月、日)和时间(小时、分钟、秒),最大精度6 毫秒。使用 10字节的存储空间。 | |||||||||
VARCHAR(n) | 存储长度可变的字符数据,长度最大为 32,672字节。使用n+2字节的存储空间。 | |||||||||
VARCHAR(n) FOR BIT DATA | 存储长度可变的二进制数据。使用 n字节的存储空间。 | |||||||||
VARGRAPHIC(n) | 存储长度可变的双字节字符数据,长度最大为16,336 字符。使用(n*2)+2 字节的存储空间。 | |||||||||
MySQL可以使用SERIAL别名作为数据类型,这相当于 BIGINTUNSIGNED NOT NULL AUTO_INCREMENT UNIQUE。 BOOL或BOOLEAN 是TINYINT(1)的同义词。在MySQL 中,DECIMAL的最大位数是65,支持的最大小数位是30。如果为DECIMAL指定 UNSIGNED,那么不允许负数。 时间戳列不支持毫秒。 | ||||||||||
数据类型 | 说明 | |||||||||
BIT | 固定长度的位串。 | |||||||||
BOOLEAN | 存储逻辑布尔值(true/false/unknown),可以是TRUE、true和1;FALSE、false和0。 | |||||||||
TINYBLOB | 用于存储二进制对象(比如图形)的原始二进制数据,最大255 字节。 | |||||||||
BLOB | 用于存储二进制对象(比如图形)的原始二进制数据,最大65,535字节。 | |||||||||
MEDIUMBLOB | 用于存储二进制对象(比如图形)的原始二进制数据,最大16,777,215字节。 | |||||||||
LONGBLOB | 用于存储二进制对象(比如图形)的原始二进制数据,最大4GB。 | |||||||||
CHAR(n) | 包含固定长度的字符串,用空格填充到长度 n。 | |||||||||
DATE | 用 3 字节的存储空间存储日历日期(年、月、日)。 | |||||||||
DATETIME | 用 8 字节的存储空间存储日历日期和天内的时间。 | |||||||||
YEAR | 用 1 字节的存储空间存储两位或四位格式的年份。 | |||||||||
DECIMAL(p,s) | 存储精确的数值,精度(p)最高为65,刻度(s)为30或更高。 | |||||||||
FLOAT | 存储浮点数,限制由硬件决定。单精度浮点数精确到大约7 位小数。UNSIGNED属性不允许负数。 | |||||||||
DOUBLE | 存储双精度浮点数,限制由硬件决定。双精度浮点数精确到大约15位小数。UNSIGNED属性不允许负数。 | |||||||||
TINYINT | 存储有符号或无符号 1字节整数。 | |||||||||
SMALLINT | 存储有符号或无符号 2字节整数。 | |||||||||
MEDIUMINT | 存储有符号或无符号 3字节整数。 | |||||||||
INTEGER | 存储有符号或无符号 4字节整数。 | |||||||||
BIGINT | 存储有符号或无符号 8字节整数。 | |||||||||
TINYTEXT | 用于存储最多 255字节的字符串数据。 | |||||||||
TEXT | 用于存储最多 65,535字节的字符串数据。 | |||||||||
MEDIUMTEXT | 用于存储最多 16,777,215字节的字符串数据。 | |||||||||
LONGTEXT | 用于存储最多 4GB的字符串数据。 | |||||||||
TIME | 用 3 字节的存储空间存储天内的时间。 | |||||||||
TIMESTAMP | 用 4字节的存储空间存储日期和时间。如果没有提供有效值的话,TIMESTAMP列会自动设置为最近操作的日期和时间。 | |||||||||
VARCHAR(n) | 存储长度可变的字符串,最大长度由 n指定。末尾的空格不存储。 | |||||||||
ENUM | 一种串对象,它的值只能是从值列表 ‘value1’,‘value2’, ..., NULL中选择的一个值。 | |||||||||
SET | 一种串对象,它可以具有零个或更多的值,这些值必须从值列表‘value1’, ‘value2’,...中选择。 | |||||||||
BINARY | 与 CHAR类型相似,但是存储二进制字节串而不是字符串。 | |||||||||
VARBINARY | 与 VARCHAR类型相似,但是存储二进制字节串而不是字符串。 | |||||||||
MYSQL | DB2 | 说明 | ||||||||
BIT | CHAR(n) FOR BIT DATA | 关于用来简化迁移的 UDF的细节,请参阅参考资料。 | ||||||||
BOOLEAN | SMALLINT 或 CHAR(1) | 使用检查约束来实施规则。 | ||||||||
TINYBLOB | VARCHAR(255) FOR BIT DATA | 可以使用 BLOB(255) 或VARCHAR(255) FOR BITDATA。在这种情况下,使用VARCHAR效率比较高。 | ||||||||
BLOB | BLOB(64K) | 如果长度小于 32K,那么考虑使用VARCHAR(n) FOR BIT DATA。 | ||||||||
MEDIUMBLOB | BLOB(16M) | 可以使用 NOT LOGGED改进性能。 | ||||||||
LONGBLOB | BLOB(2G) | 支持的 BLOB 最大长度是2GB。 | ||||||||
CHAR(n) | CHAR(n) | 在 DB2 中,‘n’的最大值为254。 | ||||||||
DATE | DATE | - | ||||||||
DATETIME | TIMESTAMP | 可以使用特殊寄存器 CURRENTTIMEZONE 对日期进行转换。 | ||||||||
YEAR | SMALLINT | 可以使用检查约束实施 YEAR规则。 | ||||||||
DECIMAL(p,s) | DECIMAL(p,s) | 如果 p 大于31,那么使用DOUBLE。 | ||||||||
FLOAT | REAL | _ | ||||||||
DOUBLE | DOUBLE | _ | ||||||||
SMALLINT | SMALLINT | 使用检查约束限制值小于 256。 | ||||||||
SMALLINT | SMALLINT | _ | ||||||||
MEDIUMINT | INTEGER | 如果需要,使用检查约束限制最大长度。 | ||||||||
INTEGER | INTEGER | _ | ||||||||
BIGINT | BIGINT | _ | ||||||||
TINYTEXT | VARCHAR(255) | 对于少于 32K 的数据,使用VARCHAR比较高效。 | ||||||||
TEXT | CLOB(64K) | DB2 允许为 CLOB或 BLOB指定长度参数。指定需要的长度,而不要使用TINY、MEDIUM或LONG CLOB。 | ||||||||
MEDIUMTEXT | CLOB(16M) | _ | ||||||||
LONGTEXT | CLOB(2G) | 最大长度是 2GB。如果使用LOGGED,那么BLOB或 CLOB 的最大长度为1GB。使用 NOTLOGGED 选项可以提高性能。 | ||||||||
TIME | TIME | _ | ||||||||
TIMESTAMP | TIMESTAMP | _ | ||||||||
VARCHAR(n) | VARCHAR(n) | 如果长度小于 32K,那么使用VARCHAR。 | ||||||||
ENUM | VARCHAR(n) | 使用检查约束来实施规则。 | ||||||||
SET | VARCHAR(n) | 使用检查约束来实施规则。 | ||||||||
BINARY | CHAR(n) FOR BIT DATA | 如果 n 小于254,那么使用CHAR(n) FOR BIT DATA;否则使用VARCHAR(n) FOR BIT DATA。 | ||||||||
VARBINARY | VARCHAR(n) FOR BIT DATA | 如果 ‘n’ 小于32K,那么使用VARCHAR;否则使用BLOB。 | ||||||||
PostgreSQL和DB2
PostgreSQL使用特殊的网络地址类型,比如inet、cidr、macaddr。这些数据类型迁移到DB2中的 VARCHAR数据类型。 PostgreSQL还支持几何数据类型。迁移工具不处理几何数据类型。目前,我们假设不太需要支持对这种数据类型进行转换。如果您使用几何数据类型,那么请告诉我们,我们将在工具中提供补丁。 处理 PostgreSQL中的位串数据类型需要在应用程序中做一些修改。目前,工具不提供这种支持。如果需要这种支持,请告诉我们。 PostgreSQL还支持多维数组,它们最好迁移成DB2中的子表。但是,工具目前不支持多维数组。 | ||||||||||
数据类型 | 说明 | |||||||||
BIGSERIAL | 存储自动递增的惟一整数,最多 8字节。 | |||||||||
BIT | 固定长度的位串。 | |||||||||
BIT VARYING(n) | 可变长度的位串,长度为 n位。 | |||||||||
BOOLEAN | 存储逻辑布尔值(true/false/unknown),可以是TRUE、t、true、y、yes和1,或者FALSE、f、false、n、no和0。 | |||||||||
BYTEA | 用于存储大型二进制对象(比如图形)的原始二进制数据。使用的存储空间是4字节加上二进制串的长度。 | |||||||||
CHAR(n) | 包含固定长度的字符串,用空格填充到长度 n。 | |||||||||
DATE | 用 4 字节的存储空间存储日历日期(年、月、日)。 | |||||||||
DATETIME | 存储日历日期和天内的时间。 | |||||||||
DECIMAL(p,s) | 存储精确的数值,精度(p)和刻度(s)为0或更高。 | |||||||||
FLOAT4 | 存储浮点数,精度为 8或更低和 6 个小数位。 | |||||||||
FLOAT8 | 存储浮点数,精度为 16或更低和 15 个小数位。 | |||||||||
SMALLINT | 存储有符号或无符号 2字节整数。 | |||||||||
INTEGER | 存储有符号或无符号 4字节整数。 | |||||||||
INT8 | 存储有符号或无符号 8字节整数。 | |||||||||
SERIAL | 存储自动递增的惟一整数值,最多 4字节存储空间。 | |||||||||
TEXT | 存储长度可变的大型字符串数据,最多 1GB。PostgreSQL自动压缩TEXT 字符串。 | |||||||||
TIME (WITHOUT TIME ZONE| | 存储天内的时间。如果不存储数据库服务器的时区,就使用8 字节的存储空间;如果存储时区,就使用12 字节。 | |||||||||
TIMESTAMP (WITHOUT TIMEZONE | | 存储日期和时间。可以存储或不存储数据库服务器的时区,使用8 字节存储空间。 | |||||||||
VARCHAR(n) | 存储可变长度的字符串,最大长度为 n。不存储末尾的空格。 | |||||||||
POSTGRESQL | DB2 | 说明 | ||||||||
BIGSERIAL | BIGINT | 使用 IDENTITY 属性模拟自动递增特性。 | ||||||||
BIT | CHAR(n) FOR BIT DATA | 对于长度最大为 254字节的字符串。 | ||||||||
BIT VARYING(n) | VARCHAR(n) FOR BIT DATA | 用于 32,672 字节以下的字符串。 | ||||||||
BYTEA | BLOB | 用于 32K 和 2GB字节之间的数据。 | ||||||||
BOOLEAN | 无布尔类型 | 使用 CHAR(1) 或SMALLINT。 | ||||||||
CHAR(n) | CHAR(n) | 最多 254 字节。 | ||||||||
DATE | DATE | 可以使用特殊寄存器 CURRENTTIMEZONE 对日期进行转换。 | ||||||||
DATETIME | TIMESTAMP | 可以使用特殊寄存器 CURRENTTIMEZONE 对日期进行转换。 | ||||||||
DECIMAL(p,s) | DECIMAL(p,s) | 如果精度大于 31,那么使用DOUBLE。 | ||||||||
FLOAT4 | REAL | 可以使用 NUMERIC 或FLOAT。 | ||||||||
FLOAT8 | DOUBLE PRECISION | 对于大数值使用 DOUBLEPRECISION,如果精度小于31,那么使用NUMERIC。 | ||||||||
SMALLINT | SMALLINT | _ | ||||||||
INTEGER | INTEGER | _ | ||||||||
INT8 | BIGINT | _ | ||||||||
VARCHAR(n) | VARCHAR(n) | 如果 ‘n’ 小于等于32K。DB2要求指定 ‘n’,而PostgreSQL不要求指定‘n’ 的值。 | ||||||||
SERIAL | INTEGER | 使用 IDENTITY 属性。 | ||||||||
TEXT | VARCHAR(n) | 如果长度小于 32K,那么使用VARCHAR;如果大于32K,那么使用BLOB。 | ||||||||
TIME (WITHOUT TIME ZONE |WITH TIME ZONE) | TIME | 没有时区。 | ||||||||
TIMESTAMP (WITHOUT TIMEZONE | WITH TIME ZONE) | TIMESTAMP | 没有时区。 | ||||||||
在 PostgreSQL中,即使在引用的表中数据类型不同,也可以创建外键约束。例如,如果父表的惟一键的数据类型是整数,那么可以在子表中数据类型为char(10)的列上创建外键。工具将转换这个约束,但是会失败,因为DB2不允许数据类型不同。 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26690043/viewspace-719501/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26690043/viewspace-719501/