sql server字段类型详解.docx
- 文档编号:29224866
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:15
- 大小:24.83KB
sql server字段类型详解.docx
《sql server字段类型详解.docx》由会员分享,可在线阅读,更多相关《sql server字段类型详解.docx(15页珍藏版)》请在冰豆网上搜索。
sqlserver字段类型详解
(1)char、varchar、text和nchar、nvarchar、ntext
char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。
所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充。
text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。
后面三种数据类型和前面的相比,从名称上看只是多了个字母"n",它表示存储的是Unicode数据类型的字符。
写过程序的朋友对Unicode应该很了解。
字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。
nchar、nvarchar的长度是在1到4000之间。
和char、varchar比较:
nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。
可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。
(2)datetime和smalldatetime
datetime:
从1753年1月1日到9999年12月31日的日期和时间数据,精确到百分之三秒。
smalldatetime:
从1900年1月1日到2079年6月6日的日期和时间数据,精确到分钟。
(3)bitint、int、smallint、tinyint和bit
bigint:
从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据。
int:
从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据。
smallint:
从-2^15(-32,768)到2^15-1(32,767)的整数数据。
tinyint:
从0到255的整数数据。
bit:
1或0的整数数据。
(4)decimal和numeric
这两种数据类型是等效的。
都有两个参数:
p(精度)和s(小数位数)。
p指定小数点左边和右边可以存储的十进制数字的最大个数,p必须是从 1到38之间的值。
s指定小数点右边可以存储的十进制数字的最大个数,s必须是从0到p之间的值,默认小数位数是0。
(5)float和real
float:
从-1.79^308到1.79^308之间的浮点数字数据。
real:
从-3.40^38到3.40^38之间的浮点数字数据。
在SQL Server中,real的同义词为float(24)。
数据库定义到char类型的字段时,不知道大家是否会犹豫一下,到底选char、nchar、varchar、nvarchar、text、ntext中哪一种呢?
结果很可能是两种,一种是节俭人士的选择:
最好是用定长的,感觉比变长能省些空间,而且处理起来会快些,无法定长只好选用定长,并且将长度设置尽可能地小;另一种是则是觉得无所谓,尽量用可变类型的,长度尽量放大些。
鉴于现在硬件像萝卜一样便宜的大好形势,纠缠这样的小问题实在是没多大意义,不过如果不弄清它,总觉得对不起劳累过度的CPU和硬盘。
下面开始了(以下说明只针对SqlServer有效):
1、当使用非unicode时慎用以下这种查询:
select f from t where f = N'xx'
原因:
无法利用到索引,因为数据库会将f先转换到unicode再和N'xx'比较
2、char 和相同长度的varchar处理速度差不多(后面还有说明)
3、varchar的长度不会影响处理速度!
!
!
(看后面解释) 4、索引中列总长度最多支持总为900字节,所以长度大于900的varchar、char和大于450的nvarchar,nchar将无法创建索引
5、text、ntext上是无法创建索引的
6、O/R Mapping中对应实体的属性类型一般是以string居多,用char[]的非常少,所以如果按mapping的合理性来说,可变长度的类型更加吻合
7、一般基础资料表中的name在实际查询中基本上全部是使用like '%xx%'这种方式,而这种方式是无法利用索引的,所以如果对于此种字段,索引建了也白建
8、其它一些像remark的字段则是根本不需要查询的,所以不需要索引
9、varchar的存放和string是一样原理的,即length {block}这种方式,所以varchar的长度和它实际占用空间是无关的
10、对于固定长度的字段,是需要额外空间来存放NULL标识的,所以如果一个char字段中出现非常多的NULL,那么很不幸,你的占用空间比没有NULL的大(但这个大并不是大太多,因为NULL标识是用bit存放的,可是如果你一行中只有你一个NULL需要标识,那么你就白白浪费1byte空间了,罪过罪过!
),这时候,你可以使用特殊标识来存放,如:
'NV'
11、同上,所以对于这种NULL查询,索引是无法生效的,假如你使用了NULL标识替代的话,那么恭喜你,你可以利用到索引了
12、char和varchar的比较成本是一样的,现在关键就看它们的索引查找的成本了,因为查找策略都一样,因此应该比较谁占用空间小。
在存放相同数量的字符情况下,如果数量小,那么char占用长度是小于varchar的,但如果数量稍大,则varchar完全可能小于char,而且要看实际填充数值的充实度,比如说varchar(3)和char(3),那么理论上应该是char快了,但如果是char(10)和varchar(10),充实度只有30%的情况下,理论上就应该是varchar快了。
因为varchar需要额外空间存放块长度,所以只要length(1-fillfactor)大于这个存放空间(好像是2字节),那么它就会比相同长度的char快了。
13、nvarchar比varchar要慢上一些,而且对于非unicode字符它会占用双倍的空间,那么这么一种类型推出来是为什么呢?
对,就是为了国际化,对于unicode类型的数据,排序规则对它们是不起作用的,而非unicode字符在处理不同语言的数据时,必须指定排序规则才能正常工作,所以n类型就这么一点好处。
总结:
1、如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么char 2、能确定长度又不一定是ansi字符或者,那么用nchar;
3、不确定长度,要查询且希望利用索引的话,用nvarchar类型吧,将它们设到400;
4、不查询的话没什么好说的,用nvarchar(4000)
5、性格豪爽的可以只用3和4,偶尔用用1,毕竟这是一种额外说明,等于告诉别人说,我一定需要长度为X位的数据
bit 整型
bit数据类型是整型,其值只能是0、1或空值。
这种数据类型用于存储只有两种可能值的数据,如Yes或No、True或False、On或Off.
注意:
很省空间的一种数据类型,如果能够满足需求应该尽量多用。
tinyint 整型
tinyint数据类型能存储从0到255之间的整数。
它在你只打算存储有限数目的数值时很有用。
这种数据类型在数据库中占用1个字节.
注意:
如果bit类型太单调不能满足您的需求,您可以考虑用tinyint类型,因为这个类型相对也是比较安全的,不接受恶意脚本内容的嵌入。
smallint 整型
smallint数据类型可以存储从-2的15次幂(-32768)到2的15次幂(32767)之间的整数。
这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。
这种数据类型在数据库里占用2字节空间.
注意:
如果tinyint类型太单调不能满足您的需求,您可以考虑用smallint类型,因为这个类型相对也是比较安全的,不接受恶意脚本内容的嵌入。
int 整型
int数据类型可以存储从-2的31次幂(-2147483648)到2的31次幂(2147483647)之间的整数。
存储到数据库的几乎所有数值型的数据都可以用这种数据类型。
这种数据类型在数据库里占用4个字节.
注意:
如果smallint也不能够满足您的需求,您可以考虑用长度更大的int类型。
decimal 精确数值型
decimal数据类型能用来存储从-10的38次幂-1到10的38次幂-1的固定精度和范围的数值型数据。
使用这种数据类型时,必须指定范围和精度。
范围是小数点左右所能存储的数字的总位数。
精度是小数点右边存储的数字的位数
numeric 精确数值型
numeric数据类型与decimal相似。
smallmoney 货币型
smallmoney数据类型用来表示钱和货币值。
这种数据类型能存储从-214748.3648到214748.3647之间的数据,精确到货币单位的万分之一
money 货币型
money数据类型用来表示钱和货币值。
这种数据类型能存储从-9220亿到9220亿之间的数据,精确到货币单位的万分之一
float 近似数值型
float数据类型是一种近似数值类型,供浮点数使用。
说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。
浮点数可以是从-1.79E+308到1.79E+308之间的任意数
real 近似数值型
real数据类型像浮点数一样,是近似数值类型。
它可以表示数值在-3.40E+38到3.40E+38之间的浮点数
Smalldatetime 日期时间型
smalldatetime数据类型用来表示从1900年1月1日到2079年6月6日间的日期和时间,精确到一分钟
datetime 日期时间型
datetime数据类型用来表示日期和时间。
这种数据类型存储从1753年1月1日到9999年12月31日间所有的日期和时间数据,精确到三百分之一秒或3.33毫秒.
cursor 特殊数据型
cursor数据类型是一种特殊的数据类型,它包含一个对游标的引用。
这种数据类型用在存储过程中,而且创建表时不能用
timestamp 特殊数据型
timestamp数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。
一个表中只能有一个timestamp列。
每次插入或修改一行时,timestamp列的值都会改变。
尽管它的名字中有“time”,但timestamp列不是人们可识别的日期。
在一个数据库里,timestamp值是唯一的
Uniqueidentifier 特殊数据型
Uniqueidentifier数据类型用来存储一个全局唯一标识符,即GUID。
GUID确实是全局唯一的。
这个数几乎没有机会在另一个系统中被重建。
可以使用NEWID函数或转换一个字符串为唯一
标识符来初始化具有唯一标识符的列.
char 字符型
char数据类型用来存储指定长度的定长非统一编码型的数据。
当定义一列为此类型时,你必须指定列长。
当你总能知道要存储的数据的长度时,此数据类型很有用。
例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。
此数据类型的列宽最大为8000个字符.
varchar 字符型 varchar数据类型,同char类型一样,用来存储非统一编码型字符数据。
与char型不一样,此数据类型为变长。
当定义一列为该数据类型时,你要指定该列的最大长度。
它与char数据类型最大的区别是,存储的长度不是列长,而是数据的长度 .
text 字符型
text数据类型用来存储大量的非统一编码型字符数据。
这种数据类型最多可以有231-1或20亿个字符.
nchar 统一编码字符型
nchar数据类型用来存储定长统一编码字符型数据。
统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。
它允许大量的扩展字符。
此数据类型能存储4000种字符,使用的字节空间上增加了一倍.
nvarchar 统一编码字符型
nvarchar数据类型用作变长的统一编码字符型数据。
此数据类型能存储4000种字符,使用的字节空间增加了一倍.
ntext 统一编码字符型
ntext数据类型用来存储大量的统一编码字符型数据。
这种数据类型能存储230-1或将近10亿个字符,且使用的字节空间增加了一倍
binary 二进制数据类型
binary数据类型用来存储可达8000字节长的定长的二进制数据。
当输入表的内容接近相同的长度时,你应该使用这种数据类型.
varbinary 二进制数据类型
varbinary数据类型用来存储可达8000字节长的变长的二进制数据。
当输入表的内容大小可变时,你应该使用这种数据类型
image 二进制数据类型
image数据类型用来存储变长的二进制数据,最大可达231-1或大约20亿字节
---------------------------------------------------
(1)二进制数据类型
二进制数据包括Binary、Varbinary和Image
Binary数据类型既可以是固定长度的(Binary),也可以是变长度的。
Binary[(n)]是n位固定的二进制数据。
其中,n的取值范围是从1到8000。
其存储窨的大小是n+4个字节。
Varbinary[(n)]是n位变长度的二进制数据。
其中,n的取值范围是从1到8000。
其存储窨的大小是n+4个字节,不是n个字节。
在Image数据类型中存储的数据是以位字符串存储的,不是由SQLServer解释的,必须由应用程序来解释。
例如,应用程序可以使用BMP、TIEF、GIF和JPEG格式把数据存储在Image数据类型中。
(2)字符数据类型
字符数据的类型包括Char,Varchar和Text
字符数据是由任何字母、符号和数字任意组合而成的数据。
Varchar是变长字符数据,其长度不超过8KB。
Char是定长字符数据,其长度最多为8KB。
超过8KB的ASCII数据可以使用Text数据类型存储。
例如,因为Html文档全部都是ASCII字符,并且在一般情况下长度超过8KB,所以这些文档可以Text数据类型存储在SQLServer中。
(3)Unicode数据类型
Unicode数据类型包括Nchar,Nvarchar和Ntext
在MicrosoftSQLServer中,传统的非Unicode数据类型允许使用由特定字符集定义的字符。
在SQLServer安装过程中,允许选择一种字符集。
使用Unicode数据类型,列中可以存储任何由Unicode标准定义的字符。
在Unicode标准中,包括了以各种字符集定义的全部字符。
使用Unicode数据类型,所战用的窨是使用非Unicode数据类型所占用的窨大小的两倍。
在SQLServer中,Unicode数据以Nchar、Nvarchar和Ntext数据类型存储。
使用这种字符类型存储的列可以存储多个字符集中的字符。
当列的长度变化时,应该使用Nvarchar字符类型,这时最多可以存储4000个字符。
当列的长度固定不变时,应该使用Nchar字符类型,同样,这时最多可以存储4000个字符。
当使用Ntext数据类型时,该列可以存储多于4000个字符。
(4)日期和时间数据类型
日期和时间数据类型包括Datetime和Smalldatetime两种类型
日期和时间数据类型由有效的日期和时间组成。
例如,有效的日期和时间数据包括“4/01/9812:
15:
00:
00:
00PM”和“1:
28:
29:
15:
01AM8/17/98”。
前一个数据类型是日期在前,时间在后一个数据类型是霎时间在前,日期在后。
在MicrosoftSQLServer中,日期和时间数据类型包括Datetime和Smalldatetime两种类型时,所存储的日期范围是从1753年1月1日开始,到9999年12月31日结束(每一个值要求8个存储字节)。
使用Smalldatetime数据类型时,所存储的日期范围是1900年1月1日开始,到2079年12月31日结束(每一个值要求4个存储字节)。
日期的格式可以设定。
设置日期格式的命令如下:
SetDateFormat{format|@format_var|
其中,format|@format_var是日期的顺序。
有效的参数包括MDY、DMY、YMD、YDM、MYD和DYM。
在默认情况下,日期格式为MDY。
例如,当执行SetDateFormatYMD之后,日期的格式为“年/月/日”形式;当执行SetDateFormatDMY之后,日期的格式为“日/月/年”形式
(5)数字数据类型
数字数据只包含数字。
数字数据类型包括正数和负数、小数(浮点数)和整数
整数由正整数和负整数组成,例如39、25、0-2和33967。
在MicrsoftSQLServer中,整数存储的数据类型是 Int,Smallint和Tinyint。
Int数据类型存储数据的范围大于Smallint数据类型存储数据的范围,而Smallint据类型存储数据的范围大于Tinyint数据类型存储数据的范围。
使用Int数据狗昔存储数据的范围是从-2147483648到2147483647(每一个值要求4个字节存储空间)。
使用Smallint数据类型时,存储数据的范围从-32768到32767(每一个值要求2个字节存储空间)。
使用Tinyint数据类型时,存储数据的范围是从0到255(每一个值要求1个字节存储空间)。
精确小娄数据在SQLServer中的数据类型是Decimal和Numeric。
这种数据所占的存储空间根据该数据的位数后的位数来确定。
在SQLServer中,近似小数数据的数据类型是Float和Real。
例如,三分之一这个分数记作.3333333,当使用近似数据类型时能准确表示。
因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。
(6)货币数据表示正的或者负的货币数量。
在MicrosoftSQLServer中,货币数据的数据类型是Money和Smallmoney
Money数据类型要求8个存储字节,Smallmoney数据类型要求4个存储字节。
(7)特殊数据类型
特殊数据类型包括前面没有提过的数据类型。
特殊的数据类型有3种,即 Timestamp、Bit和Uniqueidentifier。
Timestamp用于表示SQLServer活动的先后顺序,以二进投影的格式表示。
Timestamp数据与插入数据或者日期和时间没有关系。
Bit由1或者0组成。
当表示真或者假、ON或者OFF时,使用Bit数据类型。
例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。
Uniqueidentifier由16字节的十六进制数字组成,表示一个全局唯一的。
当表的记录行要求唯一时,GUID是非常有用。
例如,在客户标识号列使用这种数据类型可以区别不同的客户。
2.用户定义的数据类型
用户定义的数据类型基于在MicrosoftSQLServer中提供的数据类型。
当几个表中必须存储同一种数据类型时,并且为保证这些列有相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。
例如,可定义一种称为 postal_code的数据类型,它基于Char数据类型。
当创建用户定义的数据类型时,必须提供三个数:
数据类型的名称、所基于的系统数据类型和数据类型的可空性。
(1)创建用户定义的数据类型
创建用户定义的数据类型可以使用Transact-SQL语句。
系统存储过程sp_addtype可以来创建用户定义的数据类型。
其语法形式如下:
sp_addtype{type},[,system_data_bype][,'null_type']
其中,type是用户定义的数据类型的名称。
system_data_type是系统提供的数据类型,例如Decimal、Int、Char 等等。
null_type表示该数据类型是如何处理空值的,必须使用单引号引起来,例如'NULL'、'NOTNULL'或者'NONULL'。
例子:
Usecust
Execsp_addtypessn,'Varchar(11)',"NotNull'
创建一个用户定义的数据类型ssn,其基于的系统数据类型是变长为11的字符,不允许空。
例子:
Usecust
Execsp_addtypebirthday,datetime,'Null'
创建一个用户定义的数据类型birthday,其基于的系统数据类型是DateTime,允许空。
例子:
Usemaster
Execsp_addtypetelephone,'varchar(24),'NotNull'
Eexcsp_addtypefax,'varchar(24)','Null'
创建两个数据类型,即telephone和fax
(2)删除用户定义的数据类型
当用户定义的数据类型不需要时,可删除。
删除用户定义的数据类型的命令是sp_droptype{'type'}。
例子:
Usemaster
Execsp_droptype'ssn'
注意:
当表中的列还正在使用用户定义的数据类型时,或者在其上面还绑定有默认或者规则时,这种用户定义的数据类型不能删除。
SQLSERVER的字段类型说明
以下为SQLSERVER7.0以上版本的字段类型说明。
SQLSERVER6.5的字段类型说明请参考SQLSERVER提供的说明。
字段类型描述
bit 0或1的整型数字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sql server字段类型详解 server 字段 类型 详解