sqlserver字段长度50和5000的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver字段长度50和5000的区别相关的知识,希望对你有一定的参考价值。

1,基于存储空间的考虑

存储空间上,存储不超过一定长度的变长字段,不同长度的变长字段存储空间是一样的,比如选择使用varchar(50)和varchar(5000)是一样的,
也就说,对于不超过50个字符串的数据存储,两者在物理空间占用上并没有区别。

这里会发现,两个表的数据在完全一致的情况下,其存储空间也是完全一样的,的确,并不会因为varchar使用一个较长的长度而多占用存储空间

2,基于性能的考虑
选择varchar(50)还是varchar(5000),在性能上确实有显著的差异,考虑到某些查询需要内存(Memory Grant),查询引擎会预估当前查询需要的内存,影响查询内存的因素有以下几个方面
1,查询的类型,有没有聚合运算,有没有排序等等
2,每个操作符涉及到的记录数量
3,数据行的大小(这里是字段类型的长度而不是字段实际长度)
当行记录的数据类型长度较大的时候,执行计划预估的平均大小较大,数据类型定义的长度越大,预估的长度越大,需要分配的内存越大
如果一个查询涉及一些聚合操作并且数据量较大,就可能需要大量的内存来完成这个查询,查询引起会分配多余实际需要的内存。

两者对数据行Size的预估是一样的(尽管是完全一样的数据)
参考技术A sqlserver字段长度50和5000的区别,首先他们代表的数值不同,其次他们代表的大小也是不一样的。

charvarcharncharnvarchar的区别

对于程序中的string型字段,SQLServer中有char、varchar、nchar、nvarchar四种类型来对应(暂时不考虑text和ntext),开建立数据库中,对这四种类型往往比较模糊,这里做一下对比。

  1. 定长或变长
    所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;有var前缀的,表示是实际存储空间是变长的,比如varchar,nvarchar变长字符数据则不会以空格填充,比较例外的是,text存储的也是可变长。
  2. Unicode或非Unicode
    数据库中,英文字符只需要一个字节存储就足够了,但汉字和其他众多非英文字符,则需要两个字节存储。如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。而前缀n就表示Unicode字符,比如nchar,nvarchar,这两种类型使用了Unicode字符集。
  3. 基于以上两点来看看字段容量
    char,varchar 最多8000个英文,4000个汉字
    nchar,nvarchar 可存储4000个字符,无论英文还是汉字
  4. 使用(个人偏好) 
    如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么char 
    能确定长度又不一定是ansi字符或者,那么用nchar; 
    对于超大数据,如文章内容,使用nText 
    其他的通用nvarchar

char、varchar、nchar、nvarchar特点比较

  • CHAR
    CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。
  • VARCHAR
    存储变长数据,但存储效率没有CHAR高,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。

从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

  • TEXT
    text
    存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。
  • NCHAR、NVARCHAR、NTEXT
    这三种从名字上看比前面三种多了个"N"。和charvarchar比较起来,ncharnvarchar最多存储4000个字符,不论是英文还是汉字;而charvarchar最多能存储8000个英文,4000个汉字。可以看出使用ncharnvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar

以上是关于sqlserver字段长度50和5000的区别的主要内容,如果未能解决你的问题,请参考以下文章

SQLSERVER中nvarchar和varchar类型的区别是啥?

SQLSERVER中nvarchar和varchar类型的区别是啥?

SQLServer数据库表字段超长,找到超长字段脚本

sql server 2005 一个索引多个字段,字段的排列顺序对搜索有啥影响??

sqlserver更改所有表的字段长度

sqlserver更改所有表的字段长度