1.设计表时如何使用char 与 varchar? 请写出你对varchar(max)的理解。
1.设计表时如何使用char 与 varchar? 请写出你对varchar(max)的理解。
char:是定长的,也就是当你输入的字符小于你指定的数目时,会在后面补空值。比如定义char(10),你输入的字符小于10时,它会再后面补空值。当你输入的字符大于10时,它会截取超出的字符,总之都会占10个字节的空间。char存储定长数据很方便,char字段上的索引效率极高,因为是固定长度,所以速度效率高。一个英文字符占一个字节,一个汉字两个字节。(由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!)
nvarchar(n):包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。最多可存储4000个字符,无论英文还是汉字都占2个字符。
varchar:如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 Varchar(10)是最合算的。存储变长数据,所以不以空格填满,但存储效率没有CHAR高。Varchar类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。 最多8000个英文,4000个汉字。
varchar一般适用于英文和数字,Nvarchar适用中文和其他字符。
sqlserver中varchar最大长度是8000,但是可以使用varchar(max),可以达到2G。(解释:数据库文件由区组成的,而区由八个物理上连续的页组成,页是SQL中存储数据的基础单位,数据就记录存在数据页。一个页大小为8K(8192字节),数据库中的数据文件(.mdf 或.ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。磁盘 I/O 操作在页级执行,也就是说,SQL Server 每次读取或写入数据的最少数据单位是数据页。数据页由页头(96字节),数据行,行偏移量(最少36个字节)三部分组成,所以数据行的最大长度是8x1024-96-36-7=8060,7表示SQL Server还需要对每一行的数据最少附加7字节的系统数据。)
varchar(max):
在MSSQL2005及以上的版本中,加入大值数据类型(varchar(max)、nvarchar(max)、varbinary(max))。大值数据类型最多可以存储2^30-1个字节的数据。
这几个数据类型在行为上和较小的数据类型 varchar、nvarchar 和 varbinary 相同。
微软的说法是用这个数据类型来代替之前的text、ntext 和 image 数据类型,它们之间的对应关系为:
varchar(max)-------text;
nvarchar(max)-----ntext;
varbinary(max)----image.
varchar(max):字符串被截断
replicate('str',n):辅助n个str字符串
1,两个不超过8000长度的“字符串自身”相加,相加之后默认总长度是不超过8000的,如果相加之后的长度超过8000,超过8000的部分会被截断
原理:(字符串默认是char型,char型最大为8000字符,所以想加超过8000会被截断))
2,相加的两个字符串中有一个长度超过了8000,相加两个字符串本身之后的结果是不会被截断的。
原理:(因为超过8000的字符串默认用varchar(max)/text来临时存储了,最大可以存2^31-1,所以可以容纳超过8000的)
3,不管字符串长度如何,将字符串赋值给varchar(max)变量之后,用“变量相加”的方式相加,赋值给第三个varchar(max)变量,其结果是不会被截断的。
所以:当无法预计相加的两个字符串本身的长度是多少,以及相加之后的长度是多少的时候,
请不要直接对两个字符串本身进行相加(+)操作,为了确保万无一失,请将字符串赋值给varchar(max)变量之后,用变量相加,因为用变量相加的方式总是会没有问题的。(或者把字符串强行数据类型成varchar(max)或者text一类)
• 比较:
1.定长或变长
所谓定长就是长度固定,当要保存的数据长度不够时将自动在其后面填充英文空格,使长度达到相应的长度;有var前缀的,表示是实际存储空间是动态变化的,比如varchar,nvarchar变长字符数据则不会以空格填充。
2.Unicode或非Unicode
数据库中,英文字符只需要一个字节存储就足够了,但汉字和其他众多非英文字符,则需要两个字节存储。如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。而前缀n就表示Unicode字符,比如nchar,nvarchar,这两种类型使用了Unicode字符集。
3.几种数据类型的存储的最大容量
char,varchar 最多8000个英文,4000个汉字
nchar,nvarchar 最多可存储4000个字符,无论英文还是汉字