到目前为止,我们已经看到了 DB2 在体系结构和特性方面的一些差异。现在就来研究这些数据库服务器在数据类型方面的差异。 @H_301_545@
|
@H_301_545@
|
DB2 之间的数据类型对比 sql ANSI 标准规定了关系数据库系统中使用的数据类型的规则。但是,并非每种数据库平台都支持标准委员会定义的每个数据类型。而且,特定数据类型的厂商实现可能与标准的规定不同,甚至在所有数据库厂商之间互不相同。因此,尽管许多 DB2 数据类型在名称和/ 或含义方面是相似的,但是也有许多需要注意的差异。 表 2 列出最常用的 DB2 数据类型。我们在后面的小节中提供 Postgresql 数据类型与 DB2 最接近的匹配。 尽管 DB2 对 sql 有一些限制(比如对约束名的长度限制、数据类型限制等等),但是各个新版本正在系统化地消除这些限制。 2. DB2 数据类型 @H_301_545@
|
数据类型 |
说明 |
BIGINT @H_301_545@
| 存储有符号或无符号整数,使用 8 字节的存储空间。 @H_301_545@
|
BLOB BLOB(n) @H_301_545@
| 存储长度可变的二进制数据,长度最大为 2 GB 。超过 1 GB 的长度不进行日志记录。 @H_301_545@
|
CHAR(n) CHARACTER(n) @H_301_545@
| 存储固定长度的字符数据,长度最大为 254 字节。使用 ‘n’ 字节的存储空间。 @H_301_545@
|
CHAR(n) FOR BIT DATA @H_301_545@
| 存储固定长度的二进制值。 @H_301_545@
|
CLOB CLOB(n) @H_301_545@
| 存储长度可变的字符数据,长度最大为 DATE @H_301_545@
| 存储日历日期,不包含天内的时间。使用 4 字节的存储空间。 @H_301_545@
|
DEC(p,s) DECIMAL(p,s) NUM(p,s) NUMERIC(p,s) @H_301_545@
| 采用精度(p )1 到 31 和刻度(s )0 到 31 来存储数值。使用 (p/2) +1 字节的存储空间。 @H_301_545@
|
DOUBLE DOUBLE PRECISION FLOAT @H_301_545@
| 存储浮点数,使用 8 字节的存储空间。 @H_301_545@
|
FLOAT(p) @H_301_545@
| 采用精度(53 来存储数值。如果 p <= 24 ,那么相当于 REAL 。如果 p >= 25 ,那么相当于 DOUBLE PRECISION 。 @H_301_545@
|
GRAPHIC(n) @H_301_545@
| 用于 National Language Support (NLS )和长度固定的字符串(常常是 DBCS ),长度最大为 127 字节。对于双字节字符集,使用 n*2 字节的存储空间;对于单字节字符集,使用 n 字节的存储空间。 @H_301_545@
|
INT INTEGER @H_301_545@
| 存储有符号或无符号整数,使用 4 字节的存储空间。 @H_301_545@
|
REAL @H_301_545@
| 存储浮点数,使用 SMALLINT @H_301_545@
| 存储有符号和无符号整数,使用 2 字节的存储空间。 @H_301_545@
|
TIME @H_301_545@
| 存储天内的时间,使用 3 字节的存储空间。 @H_301_545@
|
TIMESTAMP @H_301_545@
| 存储日期(年、月、日)和时间(小时、分钟、秒),最大精度 6 毫秒。使用 10 字节的存储空间。 @H_301_545@
|
VARCHAR(n) CHAR VARYING(n) CHARACTER VARYING(n) @H_301_545@
| 存储长度可变的字符数据,长度最大为 32,672 字节。使用 n+2 字节的存储空间。 @H_301_545@
|
VARCHAR(n) FOR BIT DATA @H_301_545@
| 存储长度可变的二进制数据。使用 VARGRAPHIC(n) @H_301_545@
| 存储长度可变的双字节字符数据,长度最大为 16,336 字符。使用 (n*2)+2 字节的存储空间。 @H_301_545@
|
@L_502_35@ DB2
@H_301_545@
| 理解 MysqL 和 DB2 之间的数据类型问题
-
从性能方面考虑,将少于 32K 的 BLOB 和 CLOB 迁移为 VARCHAR(n) WITH BIT DATA 或 VARCHAR(n) 。迁移工具通过研究表中的实际数据处理这一转换。
-
迁移工具处理 UNSIGNED 数据类型。
-
将 Boolean 数据类型迁移到 SMALLINT 或 CHAR(1) 。
-
如果小数精度大于 31 ,那么迁移工具将列转换为双精度数据类型。
-
自动递增的列迁移为数值数据类型并使用 IDENTITY 子句。
@H_301_545@
|
@H_301_545@
|
下面的表中描述 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 数据类型 @H_301_545@
|
数据类型 |
说明 |
BIT @H_301_545@
| 固定长度的位串。 @H_301_545@
|
BOOLEAN @H_301_545@
| 存储逻辑布尔值(true/false/unknown ),可以是 TRUE 、true 和 1 ;FALSE 、false 和 0 。 @H_301_545@
|
TINYBLOB @H_301_545@
| 用于存储二进制对象(比如图形)的原始二进制数据,最大 255 字节。 @H_301_545@
|
BLOB @H_301_545@
| 用于存储二进制对象(比如图形)的原始二进制数据,最大 65,535 字节。 @H_301_545@
|
MEDIUMBLOB @H_301_545@
| 用于存储二进制对象(比如图形)的原始二进制数据,最大 301_545@
|
LONGBLOB @H_301_545@
| 用于存储二进制对象(比如图形)的原始二进制数据,最大 4GB 。 @H_301_545@
|
CHAR(n) CHARACTER(n) @H_301_545@
| 包含固定长度的字符串,用空格填充到长度 n 。 @H_301_545@
|
DATE @H_301_545@
| 用 3 字节的存储空间存储日历日期(年、月、日)。 @H_301_545@
|
DATETIME @H_301_545@
| 用 8 字节的存储空间存储日历日期和天内的时间。 @H_301_545@
|
YEAR @H_301_545@
| 用 1 字节的存储空间存储两位或四位格式的年份。 @H_301_545@
|
DECIMAL(p,s) @H_301_545@
| 存储精确的数值,精度(p )最高为 65 ,刻度(s )为 30 或更高。 @H_301_545@
|
FLOAT @H_301_545@
| 存储浮点数,限制由硬件决定。单精度浮点数精确到大约 7 位小数。UNSIGNED 属性不允许负数。 @H_301_545@
|
DOUBLE REAL @H_301_545@
| 存储双精度浮点数,限制由硬件决定。双精度浮点数精确到大约 15 位小数。TINYINT @H_301_545@
| 存储有符号或无符号 1 字节整数。 @H_301_545@
|
SMALLINT @H_301_545@
| 存储有符号或无符号 2 字节整数。 @H_301_545@
|
MEDIUMINT @H_301_545@
| 存储有符号或无符号 3 字节整数。 @H_301_545@
|
INTEGER @H_301_545@
| 存储有符号或无符号 4 字节整数。 @H_301_545@
|
BIGINT @H_301_545@
| 存储有符号或无符号 8 字节整数。 @H_301_545@
|
TINYTEXT @H_301_545@
| 用于存储最多 255 字节的字符串数据。 @H_301_545@
|
TEXT @H_301_545@
| 用于存储最多 301_545@
|
MEDIUMTEXT @H_301_545@
| 用于存储最多 301_545@
|
LONGTEXT @H_301_545@
| 用于存储最多 4GB 的字符串数据。 @H_301_545@
|
TIME @H_301_545@
| 用 3 字节的存储空间存储天内的时间。 @H_301_545@
|
TIMESTAMP @H_301_545@
| 用 4 字节的存储空间存储日期和时间。如果没有提供有效值的话,TIMESTAMP 列会自动设置为最近操作的日期和时间。 @H_301_545@
|
VARCHAR(n) CHARACTER VARYING(n) CHARACTER VARYING @H_301_545@
| 存储长度可变的字符串,最大长度由 n 指定。末尾的空格不存储。 @H_301_545@
|
ENUM @H_301_545@
| 一种串对象,它的值只能是从值列表 ‘value1’,‘value2’,...,NULL 中选择的一个值。 @H_301_545@
|
SET @H_301_545@
| 一种串对象,它可以具有零个或更多的值,这些值必须从值列表 ‘301_545@
|
BINARY @H_301_545@
| 与 CHAR 类型相似,但是存储二进制字节串而不是字符串。 @H_301_545@
|
VARBINARY @H_301_545@
| 与 VARCHAR 类型相似,但是存储二进制字节串而不是字符串。 @H_301_545@
|
表 4. MysqL 数据类型到 DB2 的映射 @H_301_545@
|
MysqL |
DB2 |
说明 |
BIT @H_301_545@
| CHAR(n) FOR BIT DATA @H_301_545@
| 关于用来简化迁移的 UDF 的细节,请参阅 参考资料 。 @H_301_545@
|
BOOLEAN @H_301_545@
| SMALLINT 或 CHAR(1) @H_301_545@
| 使用检查约束来实施规则。 @H_301_545@
|
TINYBLOB @H_301_545@
| VARCHAR(255) FOR BIT DATA @H_301_545@
| 可以使用 BLOB(255) 或 VARCHAR(255) FOR BIT DATA 。在这种情况下,使用 VARCHAR 效率比较高。 @H_301_545@
|
BLOB @H_301_545@
| BLOB(64K) @H_301_545@
| 如果长度小于 32K ,那么考虑使用 VARCHAR(n) FOR BIT DATA 。 @H_301_545@
|
MEDIUMBLOB @H_301_545@
| BLOB(16M) @H_301_545@
| 可以使用 NOT LOGGED 改进性能。 @H_301_545@
|
LONGBLOB @H_301_545@
| BLOB(2G) @H_301_545@
| 支持的 BLOB 最大长度是 2GB 。 @H_301_545@
|
CHAR(n) CHARACTER(n) @H_301_545@
| CHAR(n) CHARACTER(n) @H_301_545@
| 在 DB2 中,‘n’ 的最大值为 254 。 @H_301_545@
|
DATE @H_301_545@
| DATE @H_301_545@
| - @H_301_545@
|
DATETIME @H_301_545@
| TIMESTAMP @H_301_545@
| 可以使用特殊寄存器 CURRENT TIMEZONE 对日期进行转换。 @H_301_545@
|
YEAR @H_301_545@
| SMALLINT @H_301_545@
| 可以使用检查约束实施 YEAR 规则。 @H_301_545@
|
301_545@
| 301_545@
| 如果 p 大于 31 ,那么使用 DOUBLE 。 @H_301_545@
|
FLOAT @H_301_545@
| REAL @H_301_545@
| _ @H_301_545@
|
DOUBLE REAL @H_301_545@
| DOUBLE @H_301_545@
| SMALLINT @H_301_545@
| SMALLINT @H_301_545@
| 使用检查约束限制值小于 256 。 @H_301_545@
|
SMALLINT @H_301_545@
| MEDIUMINT @H_301_545@
| INTEGER @H_301_545@
| 如果需要,使用检查约束限制最大长度。 @H_301_545@
|
INTEGER @H_301_545@
| INTEGER INT @H_301_545@
| BIGINT @H_301_545@
| BIGINT @H_301_545@
| TINYTEXT @H_301_545@
| VARCHAR(255) @H_301_545@
| 对于少于 32K 的数据,使用 VARCHAR 比较高效。 @H_301_545@
|
TEXT @H_301_545@
| CLOB(64K) @H_301_545@
| DB2 允许为 CLOB 或 BLOB 指定长度参数。指定需要的长度,而不要使用 TINY 、MEDIUM 或 LONG CLOB 。 @H_301_545@
|
MEDIUMTEXT @H_301_545@
| CLOB(16M) @H_301_545@
| LONGTEXT @H_301_545@
| CLOB(2G) @H_301_545@
| 最大长度是 2GB 。如果使用 LOGGED ,那么 BLOB 或 CLOB 的最大长度为 1GB 。使用 NOT LOGGED 选项可以提高性能。 @H_301_545@
|
TIME @H_301_545@
| TIME @H_301_545@
| TIMESTAMP @H_301_545@
| TIMESTAMP @H_301_545@
| VARCHAR(n) CHARACTER VARYING(n) @H_301_545@
| VARCHAR(n) CHARACTER VARYING(n) @H_301_545@
| 如果长度小于 32K ,那么使用 VARCHAR 。 @H_301_545@
|
ENUM @H_301_545@
| VARCHAR(n) @H_301_545@
| 使用检查约束来实施规则。 @H_301_545@
|