在 SQL Server 中,每个列、局部变量、表达式和参数都具有一个相关的数据类型。数据类型是一种属性,用于指定对象可保存的数据的类型:整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等。
SQL Server 提供系统数据类型集,该类型集定义了可与 SQL Server 一起使用的所有数据类型。您还可以使用 Transact-SQL 或 Microsoft .NET Framework 定义自己的数据类型。别名数据类型基于系统提供的数据类型。有关别名数据类型的详细信息,请参阅使用别名数据类型。用户定义类型从您使用 .NET Framework 支持的编程语言之一创建的类的方法和运算符中获取它们的特征。有关详细信息,请参阅使用 CLR 用户定义类型。
当两个具有不同数据类型、排序规则、精度、小数位数或长度的表达式通过运算符进行组合时,结果的特征由以下规则确定:
- 结果的数据类型是通过将数据类型的优先顺序规则应用到输入表达式的数据类型来确定的。有关详细信息,请参阅数据类型优先级 (Transact-SQL)。
- 当结果数据类型为 char、varchar、text、nchar、nvarchar 或ntext 时,结果的排序规则由排序规则的优先顺序规则确定。有关详细信息,请参阅排序规则优先级 (Transact-SQL)。
- 结果的精度、小数位数及长度取决于输入表达式的精度、小数位数及长度。有关详细信息,请参阅精度、小数位数和长度 (Transact-SQL)。
数据类型类别
SQL Server 中的数据类型归纳为下列类别:
精确数字 | Unicode 字符串 |
近似数字 | 二进制字符串 |
日期和时间 | 其他数据类型 |
字符串 |
在 SQL Server 中,根据其存储特征,某些数据类型被指定为属于下列各组:
- 大值数据类型:varchar(max)、nvarchar(max) 和 varbinary(max)
- 大型对象数据类型:text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max) 和xml
注意: sp_help 返回 -1 作为大值数据类型和 xml 数据类型的长度。
精确数字
bigint | numeric |
bit | smallint |
decimal | smallmoney |
int | tinyint |
money |
近似数字
float | real |
日期和时间
date | datetimeoffset |
datetime2 | smalldatetime |
datetime | time |
字符串
char | varchar |
text |
Unicode 字符串
nchar | nvarchar |
ntext |
二进制字符串
binary | varbinary |
image |
其他数据类型
cursor | timestamp |
hierarchyid | uniqueidentifier |
sql_variant | xml |
table |
常用的类型介绍
数据类型 | 描述 | 大小(以字节为单位) |
char | 固定长度的字符数据,最多可以包含8000个使用排序规则字符集的字符 | 定义的长度*1个字节 |
nchar | 固定长度的Unicode字符数据 | 定义的长度*2个字节 |
varchar | 可变长度的字符数据,最多可以包含8000个使用排序规则字符集的字符 | 每个字符1个字节 |
nvarchar | 可变长度的Unicode字符数据,最多可以包含4000个Unicode字符 | 每个字符2个字节 |
text | 可变长度的字符数据,最多可以包含2147483647个非Unicode字符 | 每个字符1个字节 |
ntext | 可变长度的Unicode字符数据,最多可以包含1073741823个Unicode字符 | 每个字符2个字节 |
sysname | Miscrosoft提供的用户定义数据类型,在功能上等同于nvarchar(128),用于引用表和列的名字 | 每个字符2个字节 |
Unicode数据类型在存储使用多种语言的数据时非常有用,但这是通过付出双倍的存储空间的代价才得到的。一些开发人员将他们所有基于字符的列都定义为nvarchar数据类型,而另外的一些开发人员却不惜一切代价避免使用Unicode数据类型。建议如果数据库有可能使用其他国家的语言,那么就使用Unicode数据类型;否则,就使用char,varchar或者text数据类型。
数据类型 | 描述 | 大小(以字节为单位) |
bit | 0或者1 | 1位(bit) |
tinyint | 0到255的整数数据 | 1个字节 |
smallint | 从-32768到32767的整数数据 | 2个字节 |
int | 从-2147482648到2147483647的整数数据 | 4个字节 |
bigint | 从-2的63次方到2的63次方-1的整数数据 | 8个字节 |
decimal或者numeric | 从-10的38次方+1到10的38次方-1的固定精度和小数位的数字数据 | 最大存储大小随精度而变化 |
money | 货币数据值,介于-2的63次方与2的63次方之间,精确到货币单位的万分之一(.0001) | 8个字节 |
smallmoney | 货币数据值,介于-214748.3648与+214748.3647之间,精确到货币单位的万分之一(.0001) | 4个字节 |
float | 浮点数,依据所定义的精确位数,可以表示从-1.79E+308到1.79E+308之间的浮点精确数字 | 4个或者8个字节 |
real | 具有24位精确的浮点数 | 4个字节 |
如果要使用货币数据值,则必须谨慎地选择数据类型。如果使用float或者real数据类型来表示货币将会产生舍入错误。而使用money和small-money数据类型可以精确到百分之一美分。对于一些货币值,客户只要求精确到美分。在这种情况下,decimal是最合适的数据类型