代码改变世界

三大数据库对比研究系列——数据类型

2011-04-20 22:10  潇湘隐者  阅读(2636)  评论(2编辑  收藏  举报

如果你经常在不同类型数据库做开发或学习时,切换数据库写脚本时,不同数据库的数据类型可能会让你有点“晕”。下面我将对Oracle、SQL Server 、MySql三种数据库的数据类型做下例举、比较

 

SQL SERVER数据库暂且以SQL Server 2005为参考

 

SQL SERVER 数据类型分的比较细: 整数数据、 字符数据、 货币数据、日期和时间数据、二进制字符串等

数据类型

所属类型

所占字节

范围

tinyint

精确数字类型

1字节

0 ~ 255

 

 

 

 

smallint

精确数字类型

2字节

-215(-32768)~215-1(32767)

 

 

 

 

int

精确数字类型

4字节

-231 (-2,147,483,648) 231-1 (2,147,483,647)

 

 

 

 

 

bigint

精确数字类型

8字节

-2^63 (-9,223,372,036,854,775,808) 2^63-1 (9,223,372,036,854,775,807)

 

 

 

 

 

bit

精确数字类型

视情况定(参加MSDN)

取值为0、1或NULL

 

 

 

 

decimal

精确数字类型

5~17字节

固定精度和小数位数。使用最大精度时,有效值从 - 10^38 +1 到 10^38 - 1

 

 

 

 

numeric

精确数字类型

5~17字节

类似于decimal

 

 

 

 

smallmoney

精确数字类型

4字节

-214,748.3648 到 214,748.3647

 

 

 

 

 

money

精确数字类型

8字节

-922,337,203,685,477.5808 到 922,337,203,685,477.5807

 

 

 

 

 

float

近似数字

 

4或8字节取决于float(n)中n的值

-1.79E + 308 至 -2.23E - 308、0 以及 2.23E - 308 至 1.79E + 308

 

 

 

 

 

real

近似数字

 

4字节

-3.40E + 38 至 -1.18E - 38、0 以及 1.18E - 38 至 3.40E + 38

 

 

 

 

 

smalldatetime

时间类型

4字节

1900 年 1 月 1 日到 2079 年 6 月 6 日

精度为一分钟

 

 

 

 

datetime

时间类型

8字节

1753 年 1 月 1 日到 9999 年 12 月 31 日

精度为3.33毫秒

 

 

 

 

char

字符串类型

Char(n)跟n有关

固定长度、非Unicode字符数据

取值范围为1~8000

 

 

 

 

varchar

字符串类型

存储大小事输入数据的实际长度加2个字节

取值范围1~8000

max指示最大存储大小是2^31 -1个字节

 

 

 

 

text

字符串类型

 

 

 

 

 

 

nchar

Unicode字符串

nchar(n)占2*n个字节

1—4000

 

 

 

 

nvarchar

Unicode字符串

nvarchar(n)占2*n

nvarchar(max)

1—4000 nvarchar(max)指示最大存储大小为2^31 -1字节

 

 

 

 

ntext

Unicode字符串

 

12^30 -1 (1073741823)字符,一个字符占两个字节

 

 

 

 

binary

二进制字符串

binary(n)

1—8000

 

 

 

 

varbinary

二进制字符串

varbinary(n|max)

1—8000 max指示2^31 -1 (2,147,483,647)

 

 

 

 

image

二进制字符串

 

 

0—2^31 -1 (2,147,483,647)

 

 

 

 

cursor

其它数据类型

 

这是变量或存储过程OUTPUT参数的一种数据类型

 

 

 

 

timestamp

其它数据类型

8字节

2000好像没有这个数据类型

 

 

 

 

sql variant

其它数据类型

 

一种数据类型,用于存储SQL Server 2005支持的各种数据类型

(不包括text、ntext、image、timestamp和sql variant)

 

 

 

 

uniqueidentifier

其它数据类型

16字节

使用NEWID函数获得

 

 

 

 

table

其它数据类型

 

一种特殊的数据类型,用于存储结果集以进行后续处理。

 

 

 

 

xml

其它数据类型

 

 

 

MySQL数据类型

 

数据类型

所属类型

所占字节

范围

SMALLINT

数字类型(整数)

2

-32000——32000

INT

数字类型(整数)

4

-2000000000——2000000000

BIGINT

数字类型(整数)

8

不能用smallint或int描述的超大整数

FLOAT

数字类型(单精度浮点)

4

单精度浮点数

DOUBLE

数字类型(双节点浮点)

8

双精度浮点数

DECIMAL

数字类型(用户定义精度的浮点数据)

字节数取决于精度与长度

 

CHAR

字符串

Char(n)与n字节

 

VARCHAR

字符串

Varchar(n)占n+1个字节

 

TEXT

字符串

2+ 实际长度

没有最大长度限制的可变长度的字符串

BLOB

二进制字符串

变长 2+实际字符串长度

存储图片、附件、二进制文件

DATE

时间类型

3

存储日期yyyy-mm-dd

TIME

时间类型

3

存储时间或时间间隔

DATETIME

时间类型

8

存储包含日期和时间的数据

TIMESTAMP

时间类型(时间戳)

4

 

YEAR

时间类型

1

YYYY格式的年份

ENUM

 

1或2

一组数据,用户可以从中选择一个

SET

 

1—8取决于设置的大小

一组数据,用户可从中选择0,1或跟多

 

ORACLE数据类型

 

数据类型

所属类型

所占字节

范围

CHAR

字符串类型

CHAR(n) n个字节 存储固定长度的子字符串,如果没有明确说明长度,默认长度为1,如果长度不足规定长度,Oracle自动用空格填充

1—2000

VARCHAR2

字符串类型

可变长字符串类型。 VARCHAR2(n) n 如果最大长度不是n,不需要空格填充,推荐使用VARCHAR2

1—4000

NCHAR

字符串类型

 

 

NVARCHAR2

字符串类型

 

 

NUMBER

数字类型

 

 

DATE

 

 

 

LONG

 

存储最大长度为2GB的变长的变长字符串

2GB

RAW

 

用来存储非结构化数据的变长字符串

长度<= 2000字节

LONG RAW

 

用来存储非结构化数据的变长字符串

长度<=2GB

ROWID

伪列

 

 

BLOB

大型对象数据类型

存储二进制数据信息

 

CLOB

大型对象数据类型

只能存储字符数据

 

NCLOB

大型对象数据类型

存储本地语言字符集数据

 

BFILE

大型对象数据类型

存储在Oracle数据库以外的文件的指针

 

UROWID

 

用来存储表示任何类型列地址的二进制字符串

 

FLOAT

 

存储浮点数

 

 

 

 

从上面我们可以看出SQL Server数据类型的粒度分得最细,当然上面整理的数据类型也未必是最新的,不同版本的数据库对数据类型的支持是不同的(有新的数据类型增加或旧的数据类型删除)。

 

SQL Server 2005或以上版本的数据类型你可以通过系统视图查看

 

SELECT * FROM SYS.types

 

SELECT NAME, max_length, PRECISION, scale FROM sys.types

 

其中max_length 表示类型的最大长度(以字节为单位)但是imgetextntext的最大长度为16,有点不明白。个人怀疑是保存的数据的地址()。至于xml-1就更不明白了。

 

Oracle 10g 的数据类型  DBA_TYPES中保存了数据库中所有的抽象数据类型   USER_TYPES 表中用户的类型。 

 

SELECT * FROM USER_TYPES WHERE TYPECODE !='OBJECT' AND TYPECODE != 'COLLECTION'

SELECT * FROM DBA_TYPES WHERE TYPECODE !=
'OBJECT' AND TYPECODE != 'COLLECTION'