SQL数据类型
SQL支持多种数据类型,包括:
- 字符数据类型:存储字符数据。
- 精确数值数据类型:存储整数值或精确小数。
- 近似数值数据类型:存储浮点数。
- 二进制数据类型:存储二进制文件,包括图像、MP3等。
- 日期和时间数据类型:存储日期、时间信息。
- 其他系统数据类型:XML、Table等
- CLR集成:公共语言运行库(Common Language Runtime),支持自定义自己的数据类型。
字符数据类型
SQL标准支持的字符数据类型包括:
- varchar:varchar(n),当不满n个字符时则在物理上不填充,但有一定额外开销,一般来说,小于等于5字节的列应当存储为char类型而不是vchar类型。n处于1~8000之间,或用字符串"max"替换n,可支持到(2^{31}-1)个字符。
- char:char(n),当不满n个字符时使用空格来填满n个字节。n处于1~8000之间。
- nvarchar与nchar:对标varchar和char,但是每个字符对应两字节,以支持Unicode字符集。
- text:在数据页之外存储大型字符数据(2GB),影响性能,尽量避免使用。
- ntext:Unicode版本的text,一个字符占两个字节,最大到4GB。
精确数值数据类型
SQL标准支持的精确数值类型包括:
- bit:占用一个字节,但是只能表示0、1、Null三者中的一个。
- tinyint:占用一个字节,表示0~255之间的整数。
- smallint:占用两个字节,表示 -32768~32767之间的整数。
- int:占用四个字节,表示 -2147483648~2147483647之间的整数。
- bight:占用八个字节,表示 -9223372036854775808~9223372036854775807之间的整数。
- numeric(p,s)和decimal(p,s):占用最多17个字节,p表示Precision精度,对应总位数;s表示Scale规模,对应小数点右边的位数。比如114.514对应numeric(6,3)或decimal(6.3)。
- money:占用八个字节,表示精确小数,-922337203685477.5808~922337203685477.5807之间的小数。
- smallmoney:占用四个字节,表示精确小数, -214748.3648~214748.3647之间的整数。
近似数值数据类型
SQL标准支持的近似数值数据类型包括:
- float(n):n表示存储尾数的位数,SQL中仅支持float(24)和float(53),默认缺省为53.
- real:相当于float(24)。
二进制数据类型
SQL标准支持的二进制数据类型包括:
- binary(n):n为1~8000,定长二进制。
- varbinary(n):n为1~8000或用"max"字符串代替以拓展到2GB。会有额外开销(2字节)。
- image:等同于varbinary(n),其在数据页外部存储,性能较差。
日期和数据数据类型
SQL标准支持的日期和时间数据类型包括:
- date:1月1日~12月31日,占用3字节。
- datetime:1753年1月1日~9999年12月31日之间的时间,精确到3.33毫秒,占用8字节。
- datetime2(n):1月1日~12月31日之间的时间,n表示秒在小数点后的精确位数,根据n占用6~8字节。
- datetimeoffset(n):datetime2的附带时区偏移量的版本,支持+/-14小时的偏移量。
- smalldatetime:1900年1月1日~2079年6月6日,精确到1分钟,占用4字节。
- time(n):表示某小时某分钟某秒,n表示秒在小数点后的精确位数,占用3~5字节。
其他系统数据类型
SQL还支持一些其他的数据类型,这里只介绍:
- timestamp:相当于binary(8),每个表只能有一个timestamp列。每次更新或插入一个含有timestamp列的行时,该行的timestamp值将自动被更新为一个计数值。注意这个值只是一个整数而不代表时间。注意,该类型在某些语言中被解析为byte[]类型。
- uniqueidentifier:全局唯一标识符(GUID),占用16字节,调用SQL中的newid()函数生成,使得其在世界上保持唯一。通常用于多台计算机的网络中。必须指定newid函数的DEFAULT子句,或使用newid函数进行INSERT。
CLR集成
集成CLR使得SQL支持我们添加UDT(用户定义类型),我们需要使用托管代码编写类、创建程序集,然后利用CREATE TYPE 语句在SQL Server中注册该UDT。
[SqlUserDefinedTypeAttribute(Format.Native)]
public struct SimpleUdt: INullable
{
public override string ToString() {...}
public bool IsNull { get; }
public static SimpleUdt Null { get; }
public static SimpleUdt Parse(SqlString s) {...}
}
create type simpleudt from [myclr].[SimpleUdt]