用户操作
[即时聊天] [发私信] [加为好友]
heiyelurenID:heiyeshuwu
892415次访问,排名39好友93人,关注者144
既然决定远行,便只顾风雨兼程。
heiyeshuwu的文章
原创 282 篇
翻译 3 篇
转载 209 篇
评论 517 篇
heiyeluren的公告

联系方式:


访问统计: free hit counter code
FeedSky订阅:
FeedSky订阅
最近评论
heiyeluren:注册发帖后才能下载。。。。不知道论坛咋设置。。。 :-)
kong:注册了也不能下载.....提示您的操作将会导致您的 金钱 低于系统规定的下限值 0
赵舜尧:感谢博主的分享,期待你的“下章接着讲述数据分割和散列方面的内容”
adobe cs4:呃,LAMP经典应用……
俺的
Adobe cs4也是
bluehouse1985:Linux 环境下的多核调试
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Total……
文章分类
收藏
    相册
    技术图片
    搜索引擎
    ::eYou::
    kevin world
    lewis - 老吕
    qyb - BT的花
    Realzay的blog
    叶金荣
    天堂地狱鬼-dulao5's Blog
    沙漠之周
    狐狸糊涂
    老韩
    與子觀化
    ::Yahoo::
    glemir’s blog
    happy_fish - 分布式文件系统FastDFS
    LinZi's Blog
    Rainx
    stauren
    互联网,请记住我 - 162同学的技术博客
    冰的河
    小蚂蚁同学滴测试博客
    张彪同学
    随网之舞 - kaven的DHTML博客
    风雪之隅
    ::朋友::
    【推荐】中文分类网
    DDR的博客
    kevin world
    miky
    PHPCup.cn论坛
    俺兄弟的blog
    冰河的技术博客:心随风动
    好旅网
    小少的技术博客
    无尘居
    晋陵路人的Blog
    李天华同学滴技术博客
    沙狐部落
    轻量级的editor
    ::网友::
    blankyao同学
    Code & Stock.
    LionD8的Blog
    MooPHP - 轻量级PHP框架
    Phzzy
    张贺同学的博客
    技术大牛老余的博客
    抚琴居
    旋木木同学滴博客
    矛盾网
    程序人生
    邢红瑞的blog
    阿健的博客
    :PHP博客:
    .: Easy style :.
    [琴剑楼]
    CoolCode.cn
    Haohappy的Blog
    Hightman
    iwind的blog
    Javascript开发站
    JD Space
    Nio's Weblog
    Open Source PHP
    PHP面对对象
    SourceForge.net
    trip的专栏
    UGIA.cn
    windix's blog
    Windix's Weblog
    一个藏袍
    俊麟 Michael`s blog
    偶然的blog
    刘敏的blog
    大龄青年的Blog
    廖宇雷的blog
    懒猫开始新生活blog
    某人的栖息地
    王春生的博客
    神仙
    :牛人blog:
    DBA notes
    http://blog.csdn.net/tingya/
    侯捷网站
    孟岩
    搜索引擎研究
    方舟
    王咏刚的BLOG
    竹笋炒肉
    荣耀
    车东[Blog^2]
    透明思考
    陈硕的Blog
    DHTML
    DHTMLGoodies
    FCKEditor
    Google Code
    Google Web Toolkit
    HTML Goodies
    HTML.it
    HTMLAre
    HTMLdog
    JavaScript Kit
    jQuery
    KindEditor
    Prototype
    TinyMCE
    W3 Schools
    Yahoo JavaScript Developer Center
    Yahoo! Developer Network
    Yahoo! UI Library (YUI)
    网页设计师Web标准
    Java国内站
    ChinaJavaWorld.com技术论坛
    IBM developerWorks 中国: Java
    Java中文站
    Java开源大全
    Java爱好者
    JR - Java翻译站
    J道-JDON
    Matrix: 与Java共舞
    中国Java开发网
    中文java技术网
    PHP国内站点
    CSDN PHP论坛
    Discuz!
    FleaPHP
    Google--PHP用户组
    IBM DeveloperWorks
    JavsScript技术讨论
    Nirvana Studio
    OpenPHP.cn
    PHPChina
    TiM Club
    中文 PFC 1.0 手册--PHP5的开发包
    中文 PFC 1.0 手册--PHP5的开发包
    中文PHP网
    太平洋--PHP开发区
    爱MySQL
    超越PHP
    PHP国外站点
    ADOdb
    Agavi Framework
    Cake PHP
    MySQL Performance Blog
    MySQL Performance Blog
    Nonaweb
    PEAR
    PECL
    PECL Windows
    PHP Builder
    PHP Classes
    PHP Classes
    PHP New Download
    PHP Security Consortium
    php.MVC
    php.MVC
    PHPkitchen(OO & MVC)
    phpPatterns
    PHP国外图书下载
    smart template
    Smarty
    SourceForge.net
    Symfony Framework
    Zend
    Zend Framework
    Unix C/C++
    Free Gentux
    周立发的blog(Linux C)
    Unix/Linux
    BSD智库
    ChinaUnix
    FreeBSDChina
    FreeLAMP
    IBM开发者Linux专区
    Linux Byte
    LinuxKit
    LinuxTS
    Linux伊甸园
    Linux技术中坚站
    Linux非常空间
    Love Unix
    NetBSD&OpenBSD中文用户组
    NetBSD中国社区
    Oracle中国用户讨论组
    OurLinux
    Unix中文
    Unix中文
    Unix中文宝库
    中国Linux公社
    中国Unix用户技术论坛
    中文FreeBSD用户组
    永远的Unix
    炎黄角马
    程序设计
    CSDN
    IBM开发者中心
    Microsoft TechNet: 主页
    MSDN 中文网站
    PHP中文站
    Sun技术社区
    中国IT认证实验室--企业应用技术
    中国协议分析网
    喜悦国际村
    太平洋电脑网---开发特区
    实用网站
    veBook(国外大量免费图书下载网站)
    Whois.net
    中国Web信息博物馆
    中国互联网络信息中心whois查询
    服务器系统信息查看
    网络安全
    AnySide.com
    CGI Secutiry
    K-OTik Security Monitoring
    Linux Security
    Packet Storm Security
    PHP Secure
    RFC中文文档索引
    Safemode.org
    SecuriTeam.com
    Security Corporation
    SecurityFocus
    SecurityTracker
    Zone-h (区域黑客,每天公布各国被黑的网站)
    中华安全网
    中国信息安全组织
    国家计算机网络应急处理中心
    安全天使
    安全焦点
    幻影旅团
    绿盟科技
    网络安全评估中心(cnns )
    在线手册
    Apache2.0中文文档
    Beyond Linux From Scratch
    Debian参考手册
    FreeBSD Porter 手册
    FreeBSD使用手册
    Linux C函数中文参考手册
    MySQL 4.1.0 中文参考手册
    NetBSD在线手册
    OpenBSD在线FAQ
    PHP ADODB 1.99版手册中文翻译(Tripc)
    PHP中文手册(国内)
    PHP中文手册(国外)
    PostgreSQL中文文档
    Red Hat Linux 9入门指南
    Red Hat Linux 9安装指南
    Red Hat Linux 9定制手册
    中国OSS技术手册中心
    技术文档手册中心-ChinaUnix
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 [转]DB2,PostgreSQL & MySQL体系结构概述和对比收藏

    新一篇: [原创]构建支持Master/Slave读写分离的数据库操作类 | 旧一篇: [转]w3c-libwww入门教程

     

    DB2,PostgreSQL & MySQL体系结构概述和对比

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

    • 体系结构模型

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

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

    • 存储引擎

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

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

    • 表空间模型

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

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

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

    • 模式支持

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

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

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

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

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

    • 数组列

    • MySQL DB2 不支持数组列。

    • PostgreSQL 支持数组列。

    • 身份验证

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

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

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

    • 实例体系结构

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

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

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

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

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

    MySQL

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

    PostgreSQL

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

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

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


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

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

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

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

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

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

    DB2

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


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

    DB2 会话由几个进程组成:

    • MySQLPostgreSQL DB2 之间有什么差异?

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

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

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

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


      db2sysc,主 DB2 系统控制器,即引擎进程。

    • 监听器进程,比如 db2tcpcm db2ipccm,它们监听用户的连接请求。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • 等等

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


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

    特性对比

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


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

    数据库连接

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

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

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

    身份验证

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

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

    DB2 使用 API 通过各种实现(比如 KerberosLDAPActive Directory 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-4Universal)驱动程序。JDBC 驱动程序是 DB2 产品的一部分。

    表类型

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

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

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

    索引类型

    取决于存储引擎。MyISAMBTREEInnoDBBTREE

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

    支持 B-树和位图索引。

    约束

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

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

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

    存储过程和用户定义函数

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

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

    支持 CREATE PROCEDURE CREATE FUNCTION 语句。存储过程可以用 SQLSQL PL)、CJavaCOBOL REXX 编写。用户定义函数可以用 SQLSQL PL)、C Java 编写。

    触发器

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

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

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

    系统配置文件

    my.conf

    Postgresql.conf

    Database Manager Configuration

    数据库配置

    my.conf

    Postgresql.conf

    Database Configuration

    客户机连接文件

    my.conf

    pg_hba.conf

    System Database Directory
    Node Directory

    XML 支持

    有限的 XML 支持。

    有限的 XML 支持。

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

    数据访问和管理服务器

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

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

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

    并发控制

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

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

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

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




    回页首




    MySQLPostgreSQL DB2 之间的数据类型对比

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

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

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


    2. DB2 数据类型

    数据类型

    说明

    BIGINT

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

    BLOB
    BLOB(n)

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

    CHAR(n)
    CHARACTER(n)

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

    CHAR(n) FOR BIT DATA

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

    CLOB
    CLOB(n)

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

    DATE

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

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

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

    DOUBLE
    DOUBLE PRECISION
    FLOAT

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

    FLOAT(p)

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

    GRAPHIC(n)

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

    INT
    INTEGER

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

    REAL

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

    SMALLINT

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

    TIME

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

    TIMESTAMP

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

    VARCHAR(n)
    CHAR VARYING(n)
    CHARACTER VARYING(n)

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

    VARCHAR(n) FOR BIT DATA

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

    VARGRAPHIC(n)

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



    MySQL DB2

    理解 MySQL DB2 之间的数据类型问题

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

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

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

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

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


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

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

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

    时间戳列不支持毫秒。


    3. MySQL 数据类型

    数据类型

    说明

    BIT

    固定长度的位串。

    BOOLEAN

    存储逻辑布尔值(true/false/unknown),可以是 TRUEtrue 1FALSEfalse 0

    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)
    CHARACTER VARYING(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 BIT DATA。在这种情况下,使用 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

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

    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 允许为 CLOB BLOB 指定长度参数。指定需要的长度,而不要使用 TINYMEDIUM LONG CLOB

    MEDIUMTEXT

    CLOB(16M)

    _

    LONGTEXT

    CLOB(2G)

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

    TIME

    TIME

    _

    TIMESTAMP

    TIMESTAMP

    _

    VARCHAR(n)
    CHARACTER VARYING(n)

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