1.概述
在SQLServer中,每个列、局部变量、表达式和参数都具有一个相关的数据类型。数据类型是一种属性,用于指定对象可保存的数据的类型:整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等。
由于SQLServer和C#都是微软的产品,都是在.NET体系下使用的,所以C#和SQLServer中的数据类型都是一一对应的。
不管是.NETFramework,还是.NETCore,SQLServer数据库都是最佳选择,数据类型完全一一对应,不需要额外的转换,且底层逻辑高度兼容。
2.SQLServer数据类型
2.1.整数数据类型
SQLServer的整数数据类型分为:bit、smallint、int、bigint。
1)Bit占1个字节的存储空间,只能用来存储1、0和NULL。对应于.NETFrameWork中的Boolean类型,对应C#中的bool类型。1与True对应,0与False对应。
Bit类型比较特殊,在SQLServer中,使用SSMS可视工具给bit类型的列赋值时,需要输入True或False,而在查询数据时,则显示为1或0。而在使用SQL语句添加数据时,则需要使用1和0表示。
2)Smallint占2个字节的存储空间:smallint类型只能用来存储整数,范围为-2^15(-32,)到2^15-1(32,)。
Smallint对应于C#中的short类型,也对应着.NetFramework的System.Int16结构。
3)Int占4个字节的存储空间:int是最常用的整数类型,范围是-2^31(-2,,,)到2^31-1(2,,,)内的所有整数。
对应于C#中的int类型,也对应于.NetFramework的System.Int32结构。
4)Bigint占8个字节的存储空间:能存储更大的整数,范围为:-2^63(-9,,,,,,)到2^63-1(9,,,,,,)内的所有整数。
Bigint是长整型,占用存储空间最大,对应于.NetFramework的System.Int64结构。与C#中的long对应。
字节越大表示的整数范围越大,如果超过字节范围出会溢出。
2.2.字符数据类型
SQLServer的字符数据类型分为:固定长度的字符串和可变长度的字符串。两者最多都是可以存储个字符,个汉字。
1)固定长度的字符串:有char(n)和nchar(n),n表示指定的长度,能存储的最大字符数。char(3)表示最大可以存储3个字符,1个半汉字,1个汉字占2个字节。
如果char存储的实际字符数小于指定的n,则会在字符串后面使用空格补全,目的是将指定的长度占完。相反,如果char存储的实际字符数大于指定的n,则会将超出的字符删除掉。
char用来存储非Unicode字符,而nchar用来存储Unicode字符串。
Unicode标准字符集中,每个字符占2个字节,包括全世界所有语言的字符。
Nchar与char一样,如果输入的字符串不足指定的长度,则会在原字符串后面补充空格。Nchar最多能存储个字符。
2)可变长度的字符串:有varchar(n)和nvarchar(n),n表示指定的长度,能存储的最大字符数。
存储的是可变的字符串,不足指定长度不会在后面补空格。每个字符也是占1个字节。例如:varchar(3),则表示最大只能存储3个字符,但如果实际存储了2个字符,那么就按实际大小存储,不会在原字符后面补空格。
Nvarchar用来存储可变长的Unicode字符串。Varchar存储非Unicode字符串。
另外,varchar(MAX)和nvarchar(MAX)表示可以存储最多的字符串。
2.3.浮点数据类型
SQLServer的浮点型分为:float和real。其中float表示双精度浮点数据类型,real表示单精度浮点数据类型。
Real数据类型占用了4个字节的存储空间。Real是一种近似值类型。Real数据类型即可以存储整数,也可以存储小数。
近似数值数据类型并不存储为许多数字指定的精确值,它们只储存这些值的最近似值。
由于float和real数据类型的这种近似特性,因此当要求使用精确数值时,比如在财务应用程序、需要舍入的操作或等值核对中,请勿使用这些数据类型。而应使用integer、decimal、money或smallmoney数据类型。
在WHERE子句搜索条件(特别是=和运算符)中,应避免使用float列或real列。float列和real列最好只限于比较或比较。
Float数据类型与real一样,都是用来表示近似值的,但float类型可以占4个或8个字节的存储空间。
2.4.精确数据类型
SQLServer精确数据类型使用Decimal或Numeric表示,两者完全一样,建议使用Decimal类型。是一种可变的小数类型,带固定精度和小数位数,范围是:-+1~-1,默认精度为18位,最小精度是1位,最大精度是38位。
例如:decimal(5,3)表示整数部分和小数部分最大一共是5位,其中小数最大为3位,则整数位最大就是2位。
Decimal如果输入的小数位数超出指定的位数,则自动四舍五入。
如果输入2位以上的整数部分就会出错。
如果输入的小数位数超出了指定的小数位数,则SQLServer会自动四舍五入。
2.5.日期数据类型
SQLServer的日期型分为:datetime、date和time。
1)Datetime
atetime数据类型用于存储日期和时间值。占8个字节的存储空间。范围是:年1月1日到年12月31日。
例如:-03-:07:06.
2)Date
ate数据类型用于存储日期数据,可以存储1-01-01~-12-31之间的任意日期值,占3个字节的固定存储空间。
3)Time(n)
ime(n)数据类型用于存储时间值,定义一天中的某个时间。此时间不能感知时区且基于24小时制。使用24小时制表示。取值范围是:00:00:00.0到23:59:59.999之间的时间值。
Time(n)默认占固定的5个字节的存储空间。n是0到7位数字,范围为0到999,它表示秒的小数部分。
2.6.货币数据类型
SQLServer货币数据类型使用money表示,money数据值有整数部分和小数部分组成,范围为:-~(-,,,,.5到,,,,.5)之间,占固定的8个字节存储空间。
小数部分精确到4位。小数位数多于4位,则会自动四舍五入。
从以上SQLServer数据库的数据类型上看,与C#中的数据类型,还有.NET中的数据类型,都是完全兼容的,因为微软在设计之前,本身就要在C#中使用的,C#与SQLServer之间是通过ADO.NET通信的。所以其类型是完全兼容的。