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