ITPub博客

首页 > Linux操作系统 > Linux操作系统 > DB2,PostgreSQL,MySQL对比

DB2,PostgreSQL,MySQL对比

原创 Linux操作系统 作者:adrain_001 时间:2012-03-25 23:07:44 0 删除 编辑

体系结构概述和对比

DB2MySQLPostgreSQL之间有许多差异。我们先看看这三种数据库服务器在基本体系结构方面的一些差异和相似之处。

  • 体系结构模型

  • MySQL数据库服务器使用一种基于专用服务器线程的体系结构。

  • PostgreSQL DB2使用一种专用服务器进程模型体系结构。

  • 存储引擎

  • MySQL数据库使用可插入的存储引擎体系结构。

  • PostgreSQL DB2使用专用的存储引擎。

  • 表空间模型

  • MySQL 对于InnoDBNDB存储引擎使用表空间。

  • PostgreSQL表空间可以跨越多个数据库。

  • DB2 表空间特定于一个数据库。

  • 模式支持

  • PostgreSQL DB2具有真正的模式支持。

  • MySQL 不具有真正的模式支持。MySQL中的模式可以被看作MySQL数据库。

  • 数据库对象名是否是大小写敏感的

  • Linux 上的MySQLPostgreSQL使用大小写敏感的数据库名、表名和列名。

  • 所有平台上的 DB2都使用大小写不敏感的名称。但是,DB2只按照大写存储名称。

  • 数组列

  • MySQL DB2不支持数组列。

  • PostgreSQL 支持数组列。

  • 身份验证

  • DB2使用各种外部安全机制来执行身份验证,比如操作系统、PAMKerberosActiveDirectoryLDAP等等。它还允许插入第三方安全模块。

  • PostgreSQL按照许多不同方式之一执行身份验证。它可以使用数据库用户/角色、操作系统、PAMKerberos等等,这取决于主机配置文件(pg_hba.conf)中的设置。

  • MySQL在数据库级实现身份验证并对密码进行加密。

  • 实例体系结构

  • DB2实例管理不同的数据库,在同一台机器上可以有许多DB2实例。

  • PostgreSQL的实例概念与数据库集群相似。

  • MySQL实例与DB2 数据库相似。

MySQLPostgreSQL数据库可以几乎每周都进行特性修改,但是DB2中的特性实现和修改要经过非常仔细的计划,这是因为有众多的业务依赖于使用DB2产品。请注意,在本文中我们使用MySQL 5.1PostgreSQL8.0.3DB2 V8.2进行比较,所以在阅读本文时请考虑到这一点。

123MySQLPostgreSQLDB2的体系结构图。我们在阅读一些文档之后竭尽我们的能力绘制出MySQLPostgreSQL的体系结构图。如果您发现不符合实际情况的地方,请告诉我们,我们会进行纠正。

MySQL

MySQL使用一种基于线程的体系结构,而PostgreSQLDB2 采用基于进程的体系结构。正如在1中看到的,一个 MySQL实例可以管理许多数据库。一个实例中的所有MySQL数据库共享一个公用的系统编目,INFORMATION_SCHEMA

DB2中的数据库是一个单独的实体,有自己的系统编目、表空间、缓冲池等等。DB2实例管理不同的数据库,但是数据库并不共享表空间、日志、系统编目或临时表空间。

具有许多数据库的一个MySQL实例可以看作DB2 中的一个数据库,而每个MySQL数据库相当于DB2 中的一个模式。如果服务器上运行几个MySQL实例,每个实例管理几个数据库,那么可以采用以下迁移方式之一:

  • 将每个 MySQL实例迁移为同一 DB2实例下的一个 DB2数据库。

  • 将每个 MySQL实例迁移为只包含一个 DB2数据库的DB2实例,并为每个 MySQL数据库分配不同的模式。

注意:当我们提到基于进程的体系结构时,指的是 UNIX®平台,因为 Windows上的模型是基于线程的体系结构。DB2PostgreSQL 都是这样的。

在一个 DB2连接的范围内只能访问一个数据库资源,而MySQL允许在同一个连接的范围内访问多个数据库资源。

MySQL最有意思的特性之一是可插入的存储引擎。可以选择MyISAMInnoDBArchiveFederatedMemoryMergeClusterNDBCustom存储引擎。每个存储引擎具有不同的性质,可以根据自己的特定需求选择某一存储引擎。对于比较,我们发现InnoDB最接近于关系数据库。


1. MySQL体系结构和进程概况

MySQL服务器进程(mysqld)可以创建许多线程:

  • 一个全局线程(每个服务器进程有一个)负责创建和管理每个用户连接线程。

  • 为处理每个新的用户连接创建一个线程。

  • 每个连接线程还执行身份验证和查询。

  • Windows上,有一个命名管道处理器线程,它针对命名管道连接请求执行与连接线程相同的工作。

  • 一个信号线程处理警报并迫使长时间空闲的连接超时。

  • 分配一个线程来处理关闭事件。

  • 有一些线程在复制期间处理主服务器和从服务器的同步。

  • 使用线程处理表刷新、维护任务等等。

MySQL使用数据缓存、记录缓存、键缓存、表缓存、主机名缓存和特权缓存来缓存和检索服务器进程中所有线程所使用的不同类型的数据。

另外,MySQL主进程(mysqld)具有用来处理数据库管理活动的线程,比如备份、恢复、并发控制等等。

PostgreSQL

PostgreSQL实例(见2)可以管理一个数据库集群。每个数据库有自己的系统编目,INFORMATION_SCHEMApg_catalog。所有数据库共享pg_databases作为公用系统表。每个数据库是一个单独的实体,数据库的集合称为集群。一个PostgreSQL实例可以管理一个数据库集群。一台服务器可以运行多个实例。

在逻辑上,PostgreSQL数据库可以迁移到DB2数据库。这两种数据库都支持模式对象类型。不能从命名的连接访问其他数据库。

PostgreSQLDB2之间最显著的差异与表空间相关。PostgreSQL表空间可以跨越多个数据库,而DB2表空间特定于一个数据库。


2. PostgreSQL体系结构和进程概况

PostgreSQL会话由几个主进程组成:

  • postmaster进程是一个主管进程,它生成其他进程并监听用户连接。

  • 用户进程(比如 psql)用来处理交互式SQL查询。

  • postmaster 生成一个或多个名为postgres的服务器进程来处理用户的数据请求。

  • 服务器进程通过信号量和共享内存来相互通信。

DB2

3显示 DB2 的体系结构。这张图解释了DB2如何使用缓冲池在磁盘之间处理数据(文件、原始设备、目录等等)。DB2使用一个连接集中器来处理大量连接。DB2页清理器和预获取器异步地工作,各个进程单独处理重做日志活动。关于DB2中锁和进程的工作方式的详细描述,请参见参考资料


3. DB2体系结构和进程概况

DB2会话由几个进程组成:

  • MySQLPostgreSQLDB2之间有什么差异?

    • MySQL使用基于线程的体系结构模型,而PostgreSQLDB2使用基于进程的体系结构模型。

    • DB2可以在一台服务器上有多个实例。每个实例中可以有许多数据库。每个数据库与其他数据库在物理上和逻辑上隔离。

    • MySQL可以在一台服务器上运行多个 mysqld实例。每个实例可以管理一个或多个 MySQL数据库。一个实例中的每个数据库并不在物理上或逻辑上隔离。MySQL中的每个数据库可以被看作DB2中的模式。

    • 可以认为 PostgreSQL数据库集群相当于DB2实例。

    db2sysc,主 DB2 系统控制器,即引擎进程。
  • 监听器进程,比如 db2tcpcmdb2ipccm,它们监听用户的连接请求。

  • 一个或多个代表应用程序工作的代理。代理有两种类型:

  • db2agent代表一个应用程序工作,并使用进程间通信或远程通信协议与其他代理通信。

  • db2agntp用来在打开内部并行的情况下满足对数据库的客户机请求。

  • 用户的进程(比如 db2)用来处理来自命令行的交互式查询。

  • db2bp ——一个持久的后台进程,用于DB2Command Line ProcessorCLP)。

  • db2disp ——一个代理调度器进程,在启用连接集中器的情况下用于将连接分配给可用的协作代理。

  • db2fmcd ——每个服务器的故障监视器协作守护进程。

  • db2fmd ——每个实例的故障监视器守护进程。

  • db2resyn ——一个重新同步管理器进程,用于处理两阶段提交。

  • db2dlock ——一个DB2 死锁探测器。

  • db2loggr ——数据库日志读取器。

  • db2loggw ——数据库日志写入器。

  • db2pclnr ——缓冲池页清理器。

  • db2pfchr ——缓冲池预获取器。

  • db2fmp ——用于在服务器上DB2地址空间之外运行用户代码。

  • 等等

DB2服务器进程通过称为数据库管理器内存(DatabaseManager Memory)和数据库共享内存(DatabaseShared Memory)的内存区域相互通信,见 4


4. DB2数据库管理器(实例)和数据库共享内存体系结构

特性对比

1对比了 MySQLPostgreSQLDB2特性。这不是一个完整的列表,但是对比了最常用的特性。


1. MySQLPostgreSQLDB2特性对比

特性

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命令添加其他缓冲池。默认的页大小在创建数据库时决定,可以是481632K

数据库连接

客户机使用 CONNECT USE语句连接数据库,这时要指定数据库名,还可以指定用户id和密码。使用角色管理数据库中的用户和用户组。

客户机使用 connect语句连接数据库,这时要指定数据库名,还可以指定用户id和密码。使用角色管理数据库中的用户和用户组。

客户机使用 connect语句连接数据库,这时要指定数据库名,还可以指定用户id和密码。使用操作系统命令在数据库外创建用户和用户组。

身份验证

MySQL 在数据库级管理身份验证。

PostgreSQL 的身份验证取决于主机配置。

DB2 使用 API通过各种实现(比如 KerberosLDAPActiveDirectoryPAM)在操作系统级对用户进行身份验证,它的可插入身份验证体系结构允许插入第三方模块。

加密

可以在表级指定密码来对数据进行加密。还可以使用AES_ENCRYPTAES_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-4Universal)驱动程序。JDBC驱动程序是DB2产品的一部分。

表类型

取决于存储引擎。例如,NDB存储引擎支持分区表,内存引擎支持内存表。

支持临时表、常规表以及范围和列表类型的分区表。不支持哈希分区表。

支持用户表、临时表、常规表以及范围、哈希和多维簇类型的分区表。

索引类型

取决于存储引擎。MyISAMBTREEInnoDBBTREE

支持 B-树、哈希、R-树和Gist索引。

支持 B-树和位图索引。

约束

支持主键、外键、惟一和非空约束。对检查约束进行解析,但是不强制实施。

支持主键、外键、惟一、非空和检查约束。

支持主键、外键、惟一、非空和检查约束。

存储过程和用户定义函数

支持 CREATE PROCEDURE CREATE FUNCTION语句。存储过程可以用SQL C++编写。用户定义函数可以用 SQLCC++ 编写。

虽然使用术语存储过程,但是只支持 CREATEFUNCTION 语句。用户定义函数可以用PL/pgSQL(专用的过程语言)、SQLC 编写。

支持 CREATE PROCEDURECREATE FUNCTION语句。存储过程可以用SQLSQLPL)、CJavaCOBOLREXX 编写。用户定义函数可以用SQLSQLPL)、CJava 编写。

触发器

支持行前触发器、行后触发器和语句触发器,触发器语句用过程语言复合语句编写。

支持行前触发器、行后触发器和语句触发器,触发器过程用C 编写。

支持行前触发器、行后和语句触发器、insteadof 触发器和包含 SQLPL 复合语句的触发器。可以从触发器调用存储过程。

系统配置文件

my.conf

Postgresql.conf

Database ManagerConfiguration

数据库配置

my.conf

Postgresql.conf

Database Configuration

客户机连接文件

my.conf

pg_hba.conf

System DatabaseDirectory
Node Directory

XML 支持

有限的 XML 支持。

有限的 XML 支持。

为访问 XML 数据提供丰富的支持。DB2ViperV9)是第一个以原生形式存储/检索XML的混合型数据库。

数据访问和管理服务器

OPTIMIZE TABLE ——回收未使用的空间并消除数据文件的碎片
myisamchk-analyze ——
更新查询优化器所使用的统计数据(MyISAM存储引擎)
mysql——
命令行工具
MySQLAdministrator ——
客户机 GUI工具

Vacuum ——回收未使用的空间
Analyze——
更新查询优化器所使用的统计数据
psql——
命令行工具
pgAdmin——
客户机 GUI 工具

Reorg ——用来重新整理数据并消除数据碎片
Runstat——
收集优化器所使用的统计数据
CLP——
命令行工具
ControlCenter ——
客户机 GUI工具

并发控制

支持表级和行级锁。InnoDB存储引擎支持READ_COMMITTEDREAD_UNCOMMITTEDREPEATABLE_READSERIALIZABLE。使用SET TRANSACTION ISOLATIONLEVEL语句在事务级设置隔离级别。

支持表级和行级锁。支持的 ANSI隔离级别是 ReadCommitted(默认 —— 能看到查询启动时数据库的快照)和Serialization(与Repeatable Read相似—— 只能看到在事务启动之前提交的结果)。使用SET TRANSACTION语句在事务级设置隔离级别。使用SETSESSION 在会话级进行设置。

支持表级和行级锁以及 4个隔离级别:RR(可重复读)、RS(读可靠)、CS(默认—— 游标可靠)和 UR(未提交读)。使用SET ISOLATION在会话级、使用WITH 子句在 SQL语句级或使用数据库配置参数在数据库级设置隔离级别。

到目前为止,我们已经看到了MySQLPostgreSQLDB2在体系结构和特性方面的一些差异。现在就来研究这些数据库服务器在数据类型方面的差异。

MySQL、PostgreSQL和 DB2 之间的数据类型对比

SQLANSI标准规定了关系数据库系统中使用的数据类型的规则。但是,并非每种数据库平台都支持标准委员会定义的每个数据类型。而且,特定数据类型的厂商实现可能与标准的规定不同,甚至在所有数据库厂商之间互不相同。因此,尽管许多MySQL、PostgreSQL和 DB2数据类型在名称和/或含义方面是相似的,但是也有许多需要注意的差异。

表 2 列出最常用的 DB2数据类型。我们在后面的小节中提供 MySQL和 PostgreSQL 数据类型与DB2 最接近的匹配。

尽管 DB2对 SQL有一些限制(比如对约束名的长度限制、数据类型限制等等),但是各个新版本正在系统化地消除这些限制。


表2. DB2 数据类型

数据类型

说明

BIGINT

存储有符号或无符号整数,使用 8字节的存储空间。

BLOB
BLOB(n)

存储长度可变的二进制数据,长度最大为 2GB。超过1 GB的长度不进行日志记录。

CHAR(n)
CHARACTER(n)

存储固定长度的字符数据,长度最大为 254字节。使用 ‘n’字节的存储空间。

CHAR(n) FOR BIT DATA

存储固定长度的二进制值。

CLOB
CLOB(n)

存储长度可变的字符数据,长度最大为 2GB。超过1 GB的长度不进行日志记录。

DATE

存储日历日期,不包含天内的时间。使用 4字节的存储空间。

DEC(p,s)
DECIMAL(p,s)
NUM(p,s)
NUMERIC(p,s)

采用精度(p131 和刻度(s031 来存储数值。使用(p/2) +1字节的存储空间。

DOUBLE
DOUBLEPRECISION
FLOAT

存储浮点数,使用 8字节的存储空间。

FLOAT(p)

采用精度(p153 来存储数值。如果p <= 24,那么相当于REAL。如果p>= 25,那么相当于 DOUBLEPRECISION

GRAPHIC(n)

用于 National LanguageSupportNLS)和长度固定的字符串(常常是DBCS),长度最大为127字节。对于双字节字符集,使用n*2 字节的存储空间;对于单字节字符集,使用n字节的存储空间。

INT
INTEGER

存储有符号或无符号整数,使用 4字节的存储空间。

REAL

存储浮点数,使用 4字节的存储空间。

SMALLINT

存储有符号和无符号整数,使用 2字节的存储空间。

TIME

存储天内的时间,使用 3字节的存储空间。

TIMESTAMP

存储日期(年、月、日)和时间(小时、分钟、秒),最大精度6 毫秒。使用 10字节的存储空间。

VARCHAR(n)
CHARVARYING(n)
CHARACTER VARYING(n)

存储长度可变的字符数据,长度最大为 32,672字节。使用n+2字节的存储空间。

VARCHAR(n) FOR BIT DATA

存储长度可变的二进制数据。使用 n字节的存储空间。

VARGRAPHIC(n)

存储长度可变的双字节字符数据,长度最大为16,336 字符。使用(n*2)+2 字节的存储空间。



MySQLDB2

理解MySQLDB2之间的数据类型问题

  • 从性能方面考虑,将少于 32KBLOB CLOB 迁移为VARCHAR(n) WITH BIT DATAVARCHAR(n)。迁移工具通过研究表中的实际数据处理这一转换。

  • 迁移工具处理 UNSIGNED数据类型。

  • Boolean 数据类型迁移到SMALLINTCHAR(1)

  • 如果小数精度大于 31,那么迁移工具将列转换为双精度数据类型。

  • 自动递增的列迁移为数值数据类型并使用IDENTITY 子句。

下面的表中描述 MySQL 和 DB2 数据类型的定义和差异。表3 描述最常用的 MySQL 数据类型。表 4 将 MySQL数据类型映射到最接近的 DB2 数据类型。

MySQL可以使用SERIAL别名作为数据类型,这相当于 BIGINTUNSIGNED NOT NULL AUTO_INCREMENT UNIQUE

BOOLBOOLEAN TINYINT(1)的同义词。在MySQL 中,DECIMAL的最大位数是65,支持的最大小数位是30。如果为DECIMAL指定 UNSIGNED,那么不允许负数。

时间戳列不支持毫秒。


3. MySQL数据类型

数据类型

说明

BIT

固定长度的位串。

BOOLEAN

存储逻辑布尔值(true/false/unknown),可以是TRUEtrue1FALSEfalse0

TINYBLOB

用于存储二进制对象(比如图形)的原始二进制数据,最大255 字节。

BLOB

用于存储二进制对象(比如图形)的原始二进制数据,最大65,535字节。

MEDIUMBLOB

用于存储二进制对象(比如图形)的原始二进制数据,最大16,777,215字节。

LONGBLOB

用于存储二进制对象(比如图形)的原始二进制数据,最大4GB

CHAR(n)
CHARACTER(n)

包含固定长度的字符串,用空格填充到长度 n

DATE

3 字节的存储空间存储日历日期(年、月、日)。

DATETIME

8 字节的存储空间存储日历日期和天内的时间。

YEAR

1 字节的存储空间存储两位或四位格式的年份。

DECIMAL(p,s)
NUMERIC(p,s)

存储精确的数值,精度(p)最高为65,刻度(s)为30或更高。

FLOAT

存储浮点数,限制由硬件决定。单精度浮点数精确到大约7 位小数。UNSIGNED属性不允许负数。

DOUBLE
REAL

存储双精度浮点数,限制由硬件决定。双精度浮点数精确到大约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)
CHARACTERVARYING(n)
CHARACTER VARYING

存储长度可变的字符串,最大长度由 n指定。末尾的空格不存储。

ENUM

一种串对象,它的值只能是从值列表 ‘value1’,‘value2’, ..., NULL中选择的一个值。

SET

一种串对象,它可以具有零个或更多的值,这些值必须从值列表‘value1’, ‘value2’,...中选择。

BINARY

CHAR类型相似,但是存储二进制字节串而不是字符串。

VARBINARY

VARCHAR类型相似,但是存储二进制字节串而不是字符串。



4. MySQL数据类型到DB2的映射

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)
CHARACTER(n)

CHAR(n)
CHARACTER(n)

DB2 中,‘n’的最大值为254

DATE

DATE

-

DATETIME

TIMESTAMP

可以使用特殊寄存器 CURRENTTIMEZONE 对日期进行转换。

YEAR

SMALLINT

可以使用检查约束实施 YEAR规则。

DECIMAL(p,s)
NUMERIC(p,s)

DECIMAL(p,s)
NUMERIC(p,s)

如果 p 大于31,那么使用DOUBLE

FLOAT

REAL

_

DOUBLE
REAL

DOUBLE

_

SMALLINT

SMALLINT

使用检查约束限制值小于 256

SMALLINT

SMALLINT

_

MEDIUMINT

INTEGER

如果需要,使用检查约束限制最大长度。

INTEGER

INTEGER
INT

_

BIGINT

BIGINT

_

TINYTEXT

VARCHAR(255)

对于少于 32K 的数据,使用VARCHAR比较高效。

TEXT

CLOB(64K)

DB2 允许为 CLOBBLOB指定长度参数。指定需要的长度,而不要使用TINYMEDIUMLONG CLOB

MEDIUMTEXT

CLOB(16M)

_

LONGTEXT

CLOB(2G)

最大长度是 2GB。如果使用LOGGED,那么BLOBCLOB 的最大长度为1GB。使用 NOTLOGGED 选项可以提高性能。

TIME

TIME

_

TIMESTAMP

TIMESTAMP

_

VARCHAR(n)
CHARACTERVARYING(n)

VARCHAR(n)
CHARACTERVARYING(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


PostgreSQLDB2

PostgreSQLDB2的数据类型问题

  • PostgreSQL中可以使用 TEXT数据类型替代 CHAR(n)VARCHAR(n)。如果存储的值的最大长度小于32K,那么将TEXT列迁移为CLOB数据类型可能不是最好的选择。迁移工具通过检查数据对TEXT列进行正确的转换。

  • PostgreSQL 可以使用精度大于31NUMERIC。将精度大于31NUMERIC迁移为 DB2 DOUBLE 数据类型。

  • Boolean 数据类型迁移为SMALLINTCHAR(1)。这可能要求在应用程序中做一些修改。

  • BIGSERIAL 数据类型映射到DB2BIGINT并加上 IDENTITY属性。

  • PostgreSQL支持对混合表达式中的数据类型进行隐式转换。DB2支持对混合表达式中的数据类型进行显式转换。

下面两个表描述 DB2 和 PostgreSQL 数据类型的定义和差异。表5 描述最常用的 PostgreSQL 数据类型。表 6 将PostgreSQL 数据类型映射到最接近的 DB2 数据类型。

PostgreSQL使用特殊的网络地址类型,比如inetcidrmacaddr。这些数据类型迁移到DB2中的 VARCHAR数据类型。

PostgreSQL还支持几何数据类型。迁移工具不处理几何数据类型。目前,我们假设不太需要支持对这种数据类型进行转换。如果您使用几何数据类型,那么请告诉我们,我们将在工具中提供补丁。

处理 PostgreSQL中的位串数据类型需要在应用程序中做一些修改。目前,工具不提供这种支持。如果需要这种支持,请告诉我们。

PostgreSQL还支持多维数组,它们最好迁移成DB2中的子表。但是,工具目前不支持多维数组。


5. PostgreSQL数据类型

数据类型

说明

BIGSERIAL
SERIAL8

存储自动递增的惟一整数,最多 8字节。

BIT

固定长度的位串。

BIT VARYING(n)
VARBIT(n)

可变长度的位串,长度为 n位。

BOOLEAN

存储逻辑布尔值(true/false/unknown),可以是TRUEttrueyyes1,或者FALSEffalsenno0

BYTEA

用于存储大型二进制对象(比如图形)的原始二进制数据。使用的存储空间是4字节加上二进制串的长度。

CHAR(n)
CHARACTER(n)

包含固定长度的字符串,用空格填充到长度 n

DATE

4 字节的存储空间存储日历日期(年、月、日)。

DATETIME

存储日历日期和天内的时间。

DECIMAL(p,s)
NUMERIC(p,s)

存储精确的数值,精度(p)和刻度(s)为0或更高。

FLOAT4
REAL

存储浮点数,精度为 8或更低和 6 个小数位。

FLOAT8
DOUBLE PRECISION

存储浮点数,精度为 16或更低和 15 个小数位。

SMALLINT

存储有符号或无符号 2字节整数。

INTEGER

存储有符号或无符号 4字节整数。

INT8
BIGINT

存储有符号或无符号 8字节整数。

SERIAL
SERIAL4

存储自动递增的惟一整数值,最多 4字节存储空间。

TEXT

存储长度可变的大型字符串数据,最多 1GBPostgreSQL自动压缩TEXT 字符串。

TIME (WITHOUT TIME ZONE|
WITH TIME ZONE)

存储天内的时间。如果不存储数据库服务器的时区,就使用8 字节的存储空间;如果存储时区,就使用12 字节。

TIMESTAMP (WITHOUT TIMEZONE |
WITH TIME ZONE)

存储日期和时间。可以存储或不存储数据库服务器的时区,使用8 字节存储空间。

VARCHAR(n)
CHARACTERVARYING(n)
CHARACTER VARYING

存储可变长度的字符串,最大长度为 n。不存储末尾的空格。



6. PostgreSQL数据类型到DB2的映射

POSTGRESQL

DB2

说明

BIGSERIAL
SERIAL8

BIGINT

使用 IDENTITY 属性模拟自动递增特性。

BIT

CHAR(n) FOR BIT DATA

对于长度最大为 254字节的字符串。

BIT VARYING(n)
VARBIT(n)

VARCHAR(n) FOR BIT DATA

用于 32,672 字节以下的字符串。

BYTEA

BLOB

用于 32K 2GB字节之间的数据。

BOOLEAN

无布尔类型

使用 CHAR(1) SMALLINT

CHAR(n)
CHARACTER (n)

CHAR(n)

最多 254 字节。

DATE

DATE

可以使用特殊寄存器 CURRENTTIMEZONE 对日期进行转换。

DATETIME

TIMESTAMP

可以使用特殊寄存器 CURRENTTIMEZONE 对日期进行转换。

DECIMAL(p,s)
NUMERIC(p,s)

DECIMAL(p,s)

如果精度大于 31,那么使用DOUBLE

FLOAT4
REAL

REAL

可以使用 NUMERIC FLOAT

FLOAT8
DOUBLE PRECISION

DOUBLE PRECISION

对于大数值使用 DOUBLEPRECISION,如果精度小于31,那么使用NUMERIC

SMALLINT

SMALLINT

_

INTEGER

INTEGER

_

INT8
BIGINT

BIGINT

_

VARCHAR(n)
CHARACTERVARYING(n)
CHARACTER VARYING

VARCHAR(n)

如果 ‘n’ 小于等于32KDB2要求指定 ‘n’,而PostgreSQL不要求指定‘n’ 的值。

SERIAL
SERIAL4

INTEGER

使用 IDENTITY 属性。

TEXT

VARCHAR(n)
CLOB

如果长度小于 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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-13

  • 博文量
    113
  • 访问量
    260271