以下是 SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景:
数据类型类别 | 数据类型 | 解释 | 内存占用 | 适用场景 |
---|---|---|---|---|
整数类型 | 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 字节 | 一般整数存储场景,如用户 ID、商品数量等。 | |
smallint | 范围是 -2^15 (-32,768) 到 2^15-1 (32,767) | 2 字节 | 存储较小范围整数的场景,如表示月份(1 - 12)等。 | |
tinyint | 无符号整数,范围是 0 到 255 | 1 字节 | 存储非常小的正整数,如年龄(一般不会超过 255)等。 | |
精确数值类型 | decimal(p, s) numeric(p, s) | p 表示精度(总位数),s 表示小数位数。可精确存储小数,范围从 -10^38 +1 到 10^38 - 1。例如 decimal(5, 2) 可存储如 123.45 这样的数。 | p <= 9 时占 5 字节;9 < p <= 19 时占 9 字节;19 < p <= 28 时占 13 字节;28 < p <= 38 时占 17 字节 | 需要精确计算小数的场景,如财务数据计算,货币金额存储等。 |
近似数值类型 | float(n) | n 表示精度,n 为 1 - 24 时相当于 float(24) ,使用 4 字节;n 为 25 - 53 时相当于 float(53) ,使用 8 字节。可表示范围约为 -1.79E + 308 到 1.79E + 308 | 4 字节(n 为 1 - 24)或 8 字节(n 为 25 - 53) | 不需要精确计算的浮点数存储场景,如科学计算中的近似值。 |
real | 单精度浮点数,范围约为 -3.40E + 38 到 3.40E + 38 | 4 字节 | 对精度要求不高的浮点数存储,如一些统计数据的近似值。 | |
日期和时间类型 | date | 仅存储日期,范围从 0001 - 01 - 01 到 9999 - 12 - 31 | 3 字节 | 只需要存储日期信息的场景,如生日、订单日期等。 |
time | 仅存储时间,精度可到 100 纳秒,范围从 00:00:00.0000000 到 23:59:59.9999999 | 3 - 5 字节(根据精度) | 只需要存储时间信息的场景,如会议时间、营业时间等。 | |
datetime | 存储日期和时间,范围从 1753 - 01 - 01 00:00:00 到 9999 - 12 - 31 23:59:59,精度为 3.33 毫秒 | 8 字节 | 同时需要日期和时间信息,且对精度要求不是特别高的场景。 | |
datetime2 | 相比 datetime 有更高的精度,范围从 0001 - 01 - 01 00:00:00 到 9999 - 12 - 31 23:59:59.9999999,精度可到 100 纳秒 | 6 - 8 字节(根据精度) | 需要更高精度日期和时间存储的场景。 | |
smalldatetime | 存储日期和时间,范围从 1900 - 01 - 01 00:00:00 到 2079 - 06 - 06 23:59:59,精度为 1 分钟 | 4 字节 | 对日期和时间范围要求较小,且精度要求不高的场景。 | |
datetimeoffset | 存储日期、时间和时区偏移量,范围从 0001 - 01 - 01 00:00:00 到 9999 - 12 - 31 23:59:59.9999999,精度可到 100 纳秒 | 8 - 10 字节(根据精度) | 涉及不同时区日期和时间存储的场景。 | |
字符串类型 | char(n) | 固定长度的字符串,n 表示字符串长度,范围是 1 - 8000。如果存储的字符串长度小于 n ,会用空格填充。 | n 字节 | 存储长度固定的字符串,如身份证号码(固定 18 位)等。 |
varchar(n) | 可变长度的字符串,n 表示最大长度,范围是 1 - 8000。只占用实际存储字符串的长度加 2 字节(用于记录长度)。 | 实际字符串长度 + 2 字节 | 存储长度可变的字符串,如用户名、地址等。 | |
text | 用于存储大量文本数据,最大长度为 2^31 - 1(2,147,483,647)个字符。 | 实际字符串长度 + 4 字节 | 存储较长的文本内容,如文章内容、备注信息等,但从 SQL Server 2016 开始不推荐使用,建议用 varchar(max) 替代。 | |
varchar(max) | 可变长度的字符串,最大长度为 2^31 - 1(2,147,483,647)个字符。 | 实际字符串长度 + 2 字节(长度小于 8000 时)或 4 字节(长度大于 8000 时) | 存储非常长的可变长度字符串,如大型文档等。 | |
Unicode 字符串类型 | nchar(n) | 固定长度的 Unicode 字符串,n 表示字符串长度,范围是 1 - 4000。每个字符占 2 字节。 | 2 * n 字节 | 存储固定长度的 Unicode 字符串,如一些多语言环境下固定长度的名称。 |
nvarchar(n) | 可变长度的 Unicode 字符串,n 表示最大长度,范围是 1 - 4000。只占用实际存储字符串的长度加 2 字节(用于记录长度),每个字符占 2 字节。 | 2 * 实际字符串长度 + 2 字节 | 存储可变长度的 Unicode 字符串,适用于多语言环境下的用户名、描述等。 | |
ntext | 用于存储大量 Unicode 文本数据,最大长度为 2^30 - 1(1,073,741,823)个字符。 | 2 * 实际字符串长度 + 4 字节 | 存储较长的 Unicode 文本内容,但从 SQL Server 2016 开始不推荐使用,建议用 nvarchar(max) 替代。 | |
nvarchar(max) | 可变长度的 Unicode 字符串,最大长度为 2^31 - 1(2,147,483,647)个字符。每个字符占 2 字节。 | 2 * 实际字符串长度 + 2 字节(长度小于 4000 时)或 4 字节(长度大于 4000 时) | 存储非常长的可变长度 Unicode 字符串,适用于多语言环境下的大型文档等。 | |
二进制类型 | binary(n) | 固定长度的二进制数据,n 表示长度,范围是 1 - 8000。如果存储的二进制数据长度小于 n ,会用 0x00 填充。 | n 字节 | 存储固定长度的二进制数据,如加密密钥等。 |
varbinary(n) | 可变长度的二进制数据,n 表示最大长度,范围是 1 - 8000。只占用实际存储二进制数据的长度加 2 字节(用于记录长度)。 | 实际二进制数据长度 + 2 字节 | 存储可变长度的二进制数据,如图片、文件等较小的二进制对象。 | |
image | 用于存储大量二进制数据,最大长度为 2^31 - 1(2,147,483,647)字节。 | 实际二进制数据长度 + 4 字节 | 存储较大的二进制对象,如大型图片、视频等,但从 SQL Server 2016 开始不推荐使用,建议用 varbinary(max) 替代。 | |
varbinary(max) | 可变长度的二进制数据,最大长度为 2^31 - 1(2,147,483,647)字节。 | 实际二进制数据长度 + 2 字节(长度小于 8000 时)或 4 字节(长度大于 8000 时) | 存储非常大的可变长度二进制数据,如大型文件、高清视频等。 | |
其他类型 | bit | 只能存储 0、1 或 NULL ,用于表示布尔值 | 1 字节 | 表示布尔类型的数据,如是否启用、是否删除等。 |
uniqueidentifier | 存储全局唯一标识符(GUID),是一个 16 字节的二进制数据 | 16 字节 | 用于在分布式系统中唯一标识记录,如在多个数据库之间同步数据时作为唯一标识。 | |
xml | 用于存储 XML 数据 | 实际 XML 数据长度 + 额外开销 | 存储和处理 XML 格式的数据,如配置文件、数据交换等。 |