日期:2014-05-17  浏览次数:20663 次

SQL中关于nvarchar类型存储数据大小的问题
我想问下大家,关于nvarchar类型存储字符串的时候指定大小和不指定有什么区别?
1:就比如定义一个nvarchar(30) 和 nvarchar(50)有什么区别?对整个内存有什么影响,和查询性能有什么影响。

我就是对这个问题不理解,既然都是动态的存储为什么还要指定大小呢?指定大小还有可能溢出,还不如都指定为无限大,反正能够根据实际情况分配内存的。。。但是这样想好想不对,但是 又不知道有什么影响。
------最佳解决方案--------------------
1、50的话就是可以增长到50个字符,但是到51个的时候就会报错,30也类似。
2、对于性能来说可变字符类型本来就比定长字符类型差但是对于分配内存方面影响不大,
我看书有这样说过,对于10个字符以下,用定长,char/nchar,10个以上建议但不强制用变长。因为这个时候变长更有优势
------其他解决方案--------------------
引用:
1、...
2、...

引用资料:
数据行结构:
char(n): 系统分配n个字节给此字段,不管字段实际长度(后边用空格补齐)
varchar(n): 假设表中有M个varchar(或者nvarchar)类型的字段
先分配两个字节(用来表示M)
再分配2*M个字节(表示各变长行的偏移)
此后字段值有多长,就分配多长

从varchar的存储方式,我们变长它还要存储偏移,所以需要指定大小

另外按照你的意思是,为啥不干脆默认为最大变长
我在查查资料
------其他解决方案--------------------
1、50 与30指的是该列所能存储的最大长度。如果超过最大长度,就会报错,所以不会溢出的。
2、变长字符串虽然能够节省一定的存储空间,但是也是以性能为代价的,例如存储的话,需要存储该字段的数据结束的位置。所以变长一般情况用在 列的长度变长比较大,并且不经常修改 的哪些列。如果要经常修改的话,还是要考虑一下定长的。
3、选取变长类型的话,要在性能和存储空间要有一个取舍。毕竟现在存储器不值钱
------其他解决方案--------------------
用30,理由就想你之前问的为什么不直接用max,这些类型,最好“足够用”就行了。别贪多。虽然它没用到那么多,但是定义还在,会预先预留空间。预留得越多,那么能用的空间就越少。这个可以理解吗?
------其他解决方案--------------------
引用:
我想问下大家,关于nvarchar类型存储字符串的时候指定大小和不指定有什么区别?
1:就比如定义一个nvarchar(30) 和 nvarchar(50)有什么区别?对整个内存有什么影响,和查询性能有什么影响。

我就是对这个问题不理解,既然都是动态的存储为什么还要指定大小呢?指定大小还有可能溢出,还不如都指定为无限大,反正能够根据实际情况分配内存的。。。但是这样想好想不对,但是 又不知道……


这个楼主可以看看技术内幕--存储引擎 哪一本书,上面解释的很清楚。或者
blog.csdn.net/herowang 上面有几篇和这个相关的
------其他解决方案--------------------
如果 varchar(300) 和 varchar(8000) 都存储相同的字符数,性能上是没有差别的,存储行为上也没有不同。因为它们都有相同的存储结构,两个字节的偏移,两个字节的列数(如果表中所有的列都是 varchar 类型)。区别只在于存储容量上。
设置为varchar(8000)的话容易产生不可利用的空闲磁盘块儿,这不太经济!
大量不可利用的空闲磁盘块儿加剧数据的分散存储,在一定程度上影响了数据库各方面的性能!
------其他解决方案--------------------
varchar(x),  nvarchar(x)这里面的x指的是最大的列宽  如果存储的字符串没达到最大列宽  那么他也只获得对应的列宽的存储空间  并不意味着系统就会给它分配x的空间给它  


varchar(n)
长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。

nvarchar(n)
包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。

两字段分别有字段值:我和coffee
那么varchar字段占2×2+6=10个字节的存储空间,而nvarchar字段占8×2=16个字节的存储空间。

如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar

上面是一个总结介绍,通过上面的介绍,可以知道。

varchar(4) 可以输入4个字线,也可以输入两个汉字

nvarchar(4) 可以输四个汉字,也可以输4个字母,但最多四个
------其他解决方案--------------------
首先谢谢大家!
引用:
1、50的话就是可以增长到50个字符,但是到51个的时候就会报错,30也类似。
2、对于性能来说可变字符类型本来就比定长字符类型差但是对于分配内存方面影响不大,
我看书有这样说过,对于10个字符以下,用定长,char/nchar,10个以上建议但不强制用变长。因为这个时候变长更有优势

最后一句是真的么,在字符较小的情况下用定长效率更高?

引用:
如果 varchar(300) 和 varchar(8000) 都存储相同的字符数。。。。

最后一句,既然是变长存储应该不会有碎片才对啊,想下因为他是按照实际的输入存储的,怎么会有碎片呢?
------其他解决方案--------------------
可能是我的意思没有表达清楚!