如果你经常在不同类型数据库做开发或学习时,切换数据库写脚本时,不同数据库的数据类型可能会让你有点“晕”。下面我将对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字符串 |
|
1—2^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) |
|
|
|
|
其它数据类型 |
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 表示类型的最大长度(以字节为单位)但是imge,text,ntext的最大长度为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'