char、nchar、varchar、nvarchar,对比那个好

简介:
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>
数据库定义到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位的数据
本文转自 netcorner 博客园博客,原文链接: http://www.cnblogs.com/netcorner/archive/2007/10/20/2912276.html  ,如需转载请自行联系原作者
相关文章
|
7月前
|
存储 关系型数据库 MySQL
面试时被这样一个问:”存储MD5值应该用VARCHAR还是用CHAR?
一个5年工作经验的小伙伴,在面试的时候被这样一个问题。说”存储MD5值应该用VARCHAR还是用CHAR“,他一时间不只如何选择,感觉用VARCHAR也可以,用CHAR也行。希望我来帮忙分析一下。
70 0
|
14天前
|
存储 数据库
5. CHAR和VARCHAR的区别?
`CHAR`和`VARCHAR`在数据库中有所不同:`CHAR`长度固定,用空格填充,存储效率高,英文占1字节,汉字占2字节;而`VARCHAR`长度可变,节省空间,英文和汉字都占2字节。
14 0
|
1月前
|
存储 机器学习/深度学习 关系型数据库
mysql中char和varchar的区别
mysql中char和varchar的区别
30 1
|
7月前
|
存储 SQL 数据库
char、varchar、nvarchar、text的区别
char、varchar、nvarchar、text的区别
33 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL之varchar和char的区别
MySQL之varchar和char的区别
17 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL 总结char与varchar的区别
MySQL 总结char与varchar的区别
28 0
|
7月前
|
存储 关系型数据库 MySQL
MySql 字符串类型 - char、varchar
MySql 字符串类型 - char、varchar
56 0
|
8月前
|
存储 SQL Oracle
通过实战探索数据库中的char、varchar、varchar2、nvarchar2的部分区别
通过实战探索数据库中的char、varchar、varchar2、nvarchar2的部分区别
|
8月前
|
存储 Java 数据安全/隐私保护
Java 最常见的面试题:char 和 varchar 的区别是什么?
Java 最常见的面试题:char 和 varchar 的区别是什么?
|
9月前
|
存储 关系型数据库 MySQL
MySQL 中 int (10) 和 char (10) 和 varchar (10) 的区别
MySQL 中 int (10) 和 char (10) 和 varchar (10) 的区别
108 0