SQL SERVER 数据类型
数据类型是定义列中可以存储什么数据以及该数据实际怎样存储的基本规则。数据类型允许限制可以存储在列中的数据的类型。数据类型允许在内部更有效地存储数据。数据类型允许变换排序顺序。
在设计数据库表的时候,表中列的数据类型的设计非常重要。最常用的数据类型是字符串数据类型,同时也是需要在设计时进行着重考虑的。有两种基本的字符串类型,分别是定长字符串和变长字符串。定长字符串是接受固定长度的数据类型,其长度是在创建表时指定的。定长列不允许多于指定的字符数目,它们分配的存储空间与指定的字符一样多。例如:如果字符串“Ben存储导30个字符的字符串列,那么存储的是30个字节。变长字符串存储可变长度的字符串文本。变长列显得灵活,但定长列的排序和操作比变长的要快的多。
字符串数据类型
CHAR(n) 1~8000个定长字符串,其长度必须在创建时指定,否则SQLSERVER认为是CHAR(1)
NCHAR(n) 1~4000个定长Unicode字符串,其长度必须在创建时指定,否则SQLSERVER认为是CHAR(1)
VARCHAR(n) 最多8000个字符的变长文本
NVARCHAR (n) 最多4000个字符的Unicode变长文本
TEXT 最多为2^31-1(2147483647)字符
NTEXT 最多为2^30-1(2147483647)字符的变长Unicode文本
VARCHAR(max) 最多为2^31-1(2147483647)字符
NVARCAHR(max) 最多为2^30-1(2147483647)字符的变长Unicode文本
数值数据类型
数值数据类型存储数值,SQL SERVER支持多种数值数据类型,每种存储的数值具有不同的取值范围。支持的取值范围越大,所需存储空间越多。
MONEY 精确到小数点后4位的货币值,支持从-922337203685477.5808~922337203685477.5807的数
SMALLMONEY 精确到小数点后4位的货币值,支持从-214748.3648~214748.3647的数
REAL 4字节浮点值
FLOAT 变长字节浮点值,4字节或者8个字节
DECIMAL(p,s) 存储固定长度和精度数据,p表示总位数,即小数点左边和右边总的位数,默认为18; s表示小数点后可存储的位数,默认是0;decimal与numeric 在数据类型上功能等效
NUMERIC(p,s) 存储固定长度和精度数据,p表示总位数,即小数点左边和右边总的位数,默认为18; s表示小数点后可存储的位数,默认是0;decimal与numeric 在数据类型上功能等效
BIT 单个二进制位字段,或者为0或者为1
TINYINT 整数值,支持0~255
SMALLINT 整数类型,支持从-32768~32767的数
INT 整数类型,支持从-2147483648~2147483647的数
BIGINT 整数值,支持-922337203685477808~922337203685477807的数
日期和时间数据类
SQL SERVER使用专用数据类型存储日期和时间值
DATETIME 存储从1753年1月1日到9999年12月31日的日期,精度为 3.33 毫秒。
DATETIME2 存储从1753年1月1日到9999年12月31日的日期,精度为 100 纳秒。
SMALLDATETIME 存储从1900年1月1日到2079年12月31日的日期,精度为 1 分钟。
DATE 存储日期
TIME 存储时间
二进制数据类型
二进制浮点数据类型可用于存储任何数据,包括二进制信息,如图像、多媒体、字处理文档。
BINARY 定长二进制数据,最多8000个字符
VARBINARY 变长二进制数据,最多8000个字符
VARBINARY(max) 变长二进制数据,超过8000个字符
其他数据类型
CURSOR 包含到游标的引用
TABLE 临时表
UNIQUEIDENTIFIER 16字节GUID格式的唯一标识
XML 合式的XML数据
知识补充:
(1)普通字符和Unicode字符
普通字符在计算机内存中是一个字节存储一个字符的,而Unicode字符的话,是用两个字节来存储一个字符的。汉字、韩文等一个文字需要两个字节来存储。
(2)字符串类型设计时的选择
如果你肯定存储的数据长度,而且不包中文的,可以选择char类型。
如果肯定存储的数据长度,但可能包括中文,可以选择nchar类型。
如果不确定存储的数据长度,存储只有英文、数字的最好用varchar
如果不确定存储的数据长度,也有可能有中文,可以选择nvarchar类型
另外:char类型是固定长度的,不足的将以半角空格“填充”,存储读取效率较变长的效率高,varchar类型的存储空间根据实际的字符串长度来确定,读取效率较低。
(3)MSSQL与C#中数据类型对应建议
char、nchar、varchar、nvarchar、text、ntext对应C#中的string类型。
整数类型中的对应关系:tinyint——Byte,smallint——short,int——int(int32),bigint——int(64)。
浮点型数据:decimal——decimal,numeric——decimal;float——double,real——single。
二进制数据类型有:Binary/VarBinary/Image,对应C#中数据类型都是Byte[]。
Bit对应Boolean。uniqueidentifier 存储全局标识符 (GUID)
(4)测试检验数据类型
CREATE TABLE [dbo].[tt_DataType](
[ID] [INT] IDENTITY(1,1) NOT NULL,
[DT_CHAR10] [CHAR](10) NULL,
[DT_VARCHAR10] [VARCHAR](10) NULL,
[DT_NCHAR10] [NCHAR](10) NULL,
[DT_NVARCHAR10] [NVARCHAR](10) NULL,
[DT_DECIMAL82] [DECIMAL](8, 2) NULL,
[DT_DECIMAL124] [DECIMAL](12, 4) NULL,
[DT_TINYINT] [TINYINT] NOT NULL,
[DT_SMALLINT] [SMALLINT] NOT NULL,
[DT_INT] [INT] NULL,
[DT_BIGINT] [BIGINT] NOT NULL,
[DT_REAL] [real] NOT NULL,
[DT_FLOAT] [float] NOT NULL)
INSERT INTO dbo.tt_DataType
( DT_CHAR10 ,DT_VARCHAR10 ,DT_NCHAR10 ,DT_NVARCHAR10 ,DT_DECIMAL82 ,DT_DECIMAL124 ,DT_TINYINT ,DT_SMALLINT ,DT_INT ,DT_BIGINT, DT_REAL, DT_FLOAT)
VALUES ( '1和2' , '1和2' , N'1和2' , N'1和2' ,123456.335 , 12345678.123 , 1, 1, 1, 1, 1, 1)
SELECT
LEN(DT_CHAR10),DATALENGTH(DT_VARCHAR10),
LEN(DT_NCHAR10),DATALENGTH(DT_NCHAR10),
LEN(DT_VARCHAR10),DATALENGTH(DT_VARCHAR10),
LEN(DT_NVARCHAR10),DATALENGTH(DT_NVARCHAR10),
LEN(DT_DECIMAL82),DATALENGTH(DT_DECIMAL82),
LEN(DT_DECIMAL124),DATALENGTH(DT_DECIMAL124),
LEN(DT_TINYINT),DATALENGTH(DT_TINYINT),
LEN(DT_SMALLINT),DATALENGTH(DT_SMALLINT),
LEN(DT_INT),DATALENGTH(DT_INT),
LEN(DT_BIGINT),DATALENGTH(DT_BIGINT),
LEN(DT_REAL),DATALENGTH(DT_REAL),
LEN(DT_FLOAT),DATALENGTH(DT_FLOAT)
FROM dbo.tt_DataType