显式和隐式数据类型转换
当数据库记录数较大的时候,我们必须考虑字段类型是否合适,它对数据库读写性能、存储空间有较大影响。
例如,对于一个人的年龄,tinyint 就足够了,因为没人活到 255 岁以上,所以没必要用int,后者会占用更大的存储空间,并对读写产生影响。
以下是我对sql server数据类型的总结,包括数据类型范围、存储,最后也对NULL值是否会占存储空间做一些说明。
精确数字
bigint
-2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) 8 字节
int
-2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647) 4 个字节
smallint
-2^15 (-32,768) 到 2^15-1 (32,767) 2 字节
tinyint
0 到 255 1 字节
decimal 和 numeric
精度 存储字节数
1 - 9 5
10-19 9
20-28 13
29-38 17
money
-922,337,203,685,477.5808 到 922,337,203,685,477.5807 8 字节
smallmoney
-214,748.3648 到 214,748.3647 4 个字节
近似数字
float
-1.79E + 308 至 -2.23E - 308、0 以及 2.23E - 308 至 1.79E + 308 取决于 n 的值
n 值 精度 存储大小
1-24 7 位数 4 个字节
25-53 15 位数 8 字节
real
-3.40E + 38 至 -1.18E - 38、0 以及 1.18E - 38 至 3.40E + 38 4 个字节
日期和时间
date 固定 3 个字节
datetime 8 字节
smalldatetime 固定 4 个字节。
time
固定 5 个字节,是使用默认的 100ns 秒的小数部分精度时的默认存储大小。 在 Informatica 中,默认为 4 个字节,固定不变,同时秒的小数部分精度默认为 1 毫秒。
datetime2
精度小于 3 的 6 个字节。
精度为 3 和 4 的 6 个字节。
所有其他精度则需要 8 个字节。1
datetimeoffset
指定的小数位数 结果 (精度, 小数位数) 列长度(以字节为单位) 秒的小数部分精度
datetimeoffset (34,7) 10 7
datetimeoffset(0) (26,0) 8 0-2
datetimeoffset(1) (28,1) 8 0-2
datetimeoffset(2) (29,2) 8 0-2
datetimeoffset(3) (30,3) 9 3-4
datetimeoffset(4) (31,4) 9 3-4
datetimeoffset(5) (32,5) 10 5-7
datetimeoffset(6) (33,6) 10 5-7
datetimeoffset(7) (34,7) 10 5-7
字符串
char [ ( n ) ]
固定长度,非 Unicode 字符串数据。 n 用于定义字符串长度,并且它必须为 1 到 8,000 之间的值。 存储大小为 n 字节。 char 的 ISO 同义词为 character。
varchar [ ( n | max ) ]
可变长度,非 Unicode 字符串数据。 n 用于定义字符串长度,并且它可以为 1 到 8,000 之间的值。 max 指示最大存储大小是 2^31-1 个字节 (2 GB)。 存储大小为所输入数据的实际长度 + 2 个字节。 varchar 的 ISO 同义词为 char varying 或 character varying。
text
服务器代码页中长度可变的非 Unicode 数据,字符串最大长度为 2^31-1 (2,147,483,647) 个字节。 当服务器代码页使用双字节字符时,存储仍是 2,147,483,647 字节。 根据字符串,存储大小可能小于 2,147,483,647 字节。
Unicode 字符串
nchar [ ( n ) ]
固定长度字符串数据。 n 用于定义字符串长度(以双字节为单位),并且它必须为 1 到 4,000 之间的值。 存储大小为 n 字节的两倍。 对于 UCS-2 编码,存储大小为 n 个字节的两倍,并且可存储的字符数也为 n。 对于 UTF-16 编码,存储大小仍为 n 个字节的两倍,但可存储的字符数可能小于 n,因为补充字符使用两个双字节(也称为代理项对)。 nchar 的 ISO 同义词是 national char 和 national character。
nvarchar [ ( n | max ) ]
可变长度字符串数据。 n 用于定义字符串长度(以双字节为单位),并且它可以是 1 到 4,000 之间的值。 max 指示最大存储大小是 2^30-1 个字符 (2 GB)。 存储大小为 n 字节的两倍 + 2 个字节。 对于 UCS-2 编码,存储大小为 n 个字节的两倍 + 2 个字节,并且可存储的字符数也为 n。 对于 UTF-16 编码,存储大小仍为 n 个字节的两倍 + 2 个字节,但可存储的字符数可能小于 n,因为补充字符使用两个双字节(也称为代理项对)。 nvarchar 的 ISO 同义词是 national char varying 和 national character varying。
ntext
长度可变的 Unicode 数据,字符串最大长度为 2^30 - 1 (1,073,741,823) 个字节。 存储大小是所输入字符串长度的两倍(以字节为单位)。 ntext 的 ISO 同义词为 national text。
二进制字符串
binary [ ( n ) ]
长度为 n 字节的固定长度二进制数据,其中 n 是从 1 到 8,000 的值。 存储大小为 n 字节。
varbinary [ ( n | max) ]
可变长度二进制数据。 n 的取值范围为 1 至 8,000。 max 指示最大存储大小是 2^31-1 个字节。 存储大小为所输入数据的实际长度 + 2 个字节。 所输入数据的长度可以是 0 字节。 varbinary 的 ANSI SQL 同义词为 binary varying。
图像
长度可变的二进制数据,从 0 到 2^31-1 (2,147,483,647) 个字节。
NULL值是否占用存储空间
在SQL SERVER中,定长记录的NULL值占用存储空间,而变长记录的NULL值不占用存储空间。
- 例如:
对于varchar数据类型,无论是空字符串还是NULL值都不占用任何空间
对于char数据类型,无论是空字符串还是NULL值都占用空间,所占用空间大小取决于建表时候指定的char数据类型的大小
参考一下链接验证上述结论
https://blog.csdn.net/h2503652646/article/details/84991240