﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-yaya-随笔分类-资料网摘</title><link>http://www.blogjava.net/yaya/category/27082.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 15 Apr 2008 19:28:13 GMT</lastBuildDate><pubDate>Tue, 15 Apr 2008 19:28:13 GMT</pubDate><ttl>60</ttl><item><title>SQL中char、varchar、text和nchar、nvarchar、ntext的区别</title><link>http://www.blogjava.net/yaya/archive/2008/04/14/192934.html</link><dc:creator>丫丫</dc:creator><author>丫丫</author><pubDate>Mon, 14 Apr 2008 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/yaya/archive/2008/04/14/192934.html</guid><wfw:comment>http://www.blogjava.net/yaya/comments/192934.html</wfw:comment><comments>http://www.blogjava.net/yaya/archive/2008/04/14/192934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaya/comments/commentRss/192934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaya/services/trackbacks/192934.html</trackback:ping><description><![CDATA[SQL中char、varchar、text和nchar、nvarchar、ntext的区别<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1、CHAR。CHAR存储定长数据很方便，CHAR字段上的索引效率级高，比如定义char(10)，那么不论你存储的数据是否达到了10个字节，都要占去10个字节的空间。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2、VARCHAR。存储变长数据，但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的，我们只知道它不可能超过10个字符，把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么&#8220;+1&#8221;呢？这一个字节用于保存实际使用了多大的长度。<br />
&nbsp;&nbsp;&nbsp; 从空间上考虑，用varchar合适；从效率上考虑，用char合适，关键是根据实际情况找到权衡点。<br />
&nbsp;&nbsp;&nbsp; 3、TEXT。text存储可变长度的非Unicode数据，最大长度为2^31-1(2,147,483,647)个字符。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个&#8220;N&#8221;。它表示存储的是Unicode数据类型的字符。我们知道字符中，英文字符只需要一个字节存储就足够了，但汉字众多，需要两个字节存储，英文与汉字同时存在时容易造成混乱，Unicode字符集就是为了解决字符集这种不兼容的问题而产生的，它所有的字符都用两个字节表示，即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较起来，nchar、nvarchar则最多存储4000个字符，不论是英文还是汉字；而char、varchar最多能存储8000个英文，4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字，较为方便，但在存储英文时数量上有些损失。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 所以一般来说，如果含有中文字符，用nchar/nvarchar，如果纯英文和数字，用char/varchar。<br />
<br />
<br />
<hr />
<br />
<br />
<br />
数据库定义到char类型的字段时 char、nchar、varchar、nvarchar、text、ntext中哪一种呢 <br />
　数据库定义到char类型的字段时，不知道大家是否会犹豫一下，到底选char、nchar、varchar、nvarchar、text、ntext中哪一种呢？结果很可能是两种，一种是节俭人士的选择：最好是用定长的，感觉比变长能省些空间，而且处理起来会快些，无法定长只好选用定长，并且将长度设置尽可能地小；另一种是则是觉得无所谓，尽量用可变类型的，长度尽量放大些。 <br />
<br />
　　鉴于现在硬件像萝卜一样便宜的大好形势，纠缠这样的小问题实在是没多大意义，不过如果不弄清它，总觉得对不起劳累过度的CPU和硬盘。 <br />
<br />
下面开始了(以下说明只针对SqlServer有效)： <br />
<br />
1、当使用非unicode时慎用以下这种查询： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select f from t where f = N'xx' <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;原因：无法利用到索引，因为数据库会将f先转换到unicode再和N'xx'比较 <br />
<br />
2、char 和相同长度的varchar处理速度差不多（后面还有说明） <br />
<br />
3、varchar的长度不会影响处理速度！！！（看后面解释） <br />
<br />
4、索引中列总长度最多支持总为900字节，所以长度大于900的varchar、char和大于450的nvarchar,nchar将无法创建索引 <br />
<br />
5、text、ntext上是无法创建索引的 <br />
<br />
6、O/R Mapping中对应实体的属性类型一般是以string居多，用char[]的非常少，所以如果按mapping的合理性来说，可变长度的类型更加吻合 <br />
<br />
7、一般基础资料表中的name在实际查询中基本上全部是使用like '%xx%'这种方式，而这种方式是无法利用索引的，所以如果对于此种字段，索引建了也白建 <br />
<br />
8、其它一些像remark的字段则是根本不需要查询的，所以不需要索引 <br />
<br />
9、varchar的存放和string是一样原理的，即length {block}这种方式，所以varchar的长度和它实际占用空间是无关的 <br />
<br />
10、对于固定长度的字段，是需要额外空间来存放NULL标识的，所以如果一个char字段中出现非常多的NULL，那么很不幸，你的占用空间比没有NULL的大（但这个大并不是大太多，因为NULL标识是用bit存放的，可是如果你一行中只有你一个NULL需要标识，那么你就白白浪费1byte空间了，罪过罪过！），这时候，你可以使用特殊标识来存放，如：'NV' <br />
<br />
11、同上，所以对于这种NULL查询，索引是无法生效的，假如你使用了NULL标识替代的话，那么恭喜你，你可以利用到索引了 <br />
<br />
12、char和varchar的比较成本是一样的，现在关键就看它们的索引查找的成本了，因为查找策略都一样，因此应该比较谁占用空间小。在存放相同数量的字符情况下，如果数量小，那么char占用长度是小于varchar的，但如果数量稍大，则varchar完全可能小于char，而且要看实际填充数值的充实度，比如说varchar(3)和char(3)，那么理论上应该是char快了，但如果是char(10)和varchar(10)，充实度只有30%的情况下，理论上就应该是varchar快了。因为varchar需要额外空间存放块长度，所以只要length(1-fillfactor)大于这个存放空间（好像是2字节)，那么它就会比相同长度的char快了。 <br />
<br />
13、nvarchar比varchar要慢上一些，而且对于非unicode字符它会占用双倍的空间，那么这么一种类型推出来是为什么呢？对，就是为了国际化，对于unicode类型的数据，排序规则对它们是不起作用的，而非unicode字符在处理不同语言的数据时，必须指定排序规则才能正常工作，所以n类型就这么一点好处。 <br />
<br />
<br />
总结陈词： <br />
1、如果数据量非常大，又能100%确定长度且保存只是ansi字符，那么char <br />
2、能确定长度又不一定是ansi字符或者，那么用nchar； <br />
3、不确定长度，要查询且希望利用索引的话，用nvarchar类型吧，将它们设到400； <br />
4、不查询的话没什么好说的，用nvarchar(4000) <br />
5、性格豪爽的可以只用3和4，偶尔用用1，毕竟这是一种额外说明，等于告诉别人说，我一定需要长度为X位的数据 <br />
<br />
这样一来，生活是不是变成美好多了？　如果还有没明白的，那么还是省点钱去买萝卜吧。
<img src ="http://www.blogjava.net/yaya/aggbug/192934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaya/" target="_blank">丫丫</a> 2008-04-14 22:21 <a href="http://www.blogjava.net/yaya/archive/2008/04/14/192934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>