zoukankan      html  css  js  c++  java
  • 我们需要什么样的字段类型?

    我们需要什么样的字段类型?
      数据库定义到char类型的字段时,不知道大家是否会犹豫一下,到底选char、nchar、varchar、nvarchar、text、ntext中哪一种呢?结果很可能是两种,一种是节俭人士的选择:最好是用定长的,感觉比变长能省些空间,而且处理起来会快些,无法定长只好选用不定长的,并且将长度设置尽可能地小;另一种则是觉得无所谓,尽量用可变类型的,长度尽量放大些。

      鉴于现在硬件像萝卜一样便宜的大好形势,纠缠这样的小问题实在是没多大意义,不过如果不弄清它,总觉得对不起劳累过度的CPU和硬盘。

    下面开始了(以下说明只针对SqlServer有效):

    1、当使用非unicode时慎用以下这种查询: 
            select * from table where userName = N'xxx' 
         原因:无法利用索引,因为数据库会将userName先转换到unicode再和N'xx'比较

    2、char和相同长度的varchar处理速度差不多

    3、char和varchar的比较成本是一样的,现在关键就看它们的索引查找的成本了,因为查找策略都一样,因此应该比较谁占用空间小。在存放相同数量的字符情况下,如果数量小,那么char占用长度是小于varchar的,但如果数量稍大,则varchar完全可能小于char,而且要看实际填充数值的充实度,比如说varchar(3)和char(3),那么理论上应该是char快了,但如果是char(10)和varchar(10),充实度只有30%的情况下,理论上就应该是varchar快了。因为varchar需要额外空间存放块长度,所以只要length(1-fillfactor)大于这个存放空间(好像是2字节),那么它就会比相同长度的char快了。

    4、varchar的长度不会影响处理速度

    5、varchar的存放和string是一样原理的,即length {block}这种方式,所以varchar的长度和它实际占用空间是无关的

    6、nvarchar比varchar要慢上一些,而且对于非unicode字符它会占用双倍的空间,那么这么一种类型推出来是为什么呢?对,就是为了国际化,对于unicode类型的数据,排序规则对它们是不起作用的,而非unicode字符在处理不同语言的数据时,必须指定排序规则才能正常工作,所以n类型就这么一点好处。
    7、索引中列总长度最多支持900字节,所以长度大于900的varchar、char和大于450的nvarchar,nchar将无法创建索引

    8、text、ntext上是无法创建索引的

    9、一般基础资料表中的userName在实际查询中基本上全部是使用like '%xxx%'这种方式,而这种方式是无法利用索引的,所以如果对于此种字段,索引建了也是白建

    10、其它一些字段则是根本不需要查询的,所以不需要创建索引

    11、对于固定长度的字段,是需要额外空间来存放NULL标识的,所以如果一个char字段中出现非常多的NULL,那么很不幸,占用空间比没有NULL的大(但这个大并不是大太多,因为NULL标识是用bit存放的,如果一行中只有一个NULL需要标识,那么你就白白浪费1byte空间了,罪过罪过!),这时候,你可以使用特殊标识来存放,如:'NV'


    总结陈词:
    1、如果数据量非常大,又能100%确定长度且保存的只是ansi字符,那么用char
    2、如果能确定长度,但不一定是ansi字符,那么用nchar;
    3、如果不确定长度,要查询且希望利用索引的话,用nvarchar类型吧,将它设到400;
    4、不查询的话,没什么好说的,用nvarchar(4000)
    5、性格豪爽的可以只用3和4,偶尔用用1,毕竟这是一种额外说明,等于告诉别人说,我一定需要长度为X位的数据

    这样一来,生活是不是变成美好多了? 如果还有没明白的,那么还是省点钱去买萝卜吧。


    引用自:
    http://www.cnblogs.com/progame/archive/2005/01/12/90298.aspx?Pending=true#Post

  • 相关阅读:
    只会写“Hello World”的菜鸟心声
    新的旅程
    生成[1,2,,3,4,5,6,7,8,9]的随机数组?
    计算java集合中自定义对象出现的次数
    iOS https 证书信任漏洞解决办法
    自定义 URL Scheme 完全指南
    Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
    url schemes格式错误
    给UITapGestureRecognizer添加tag
    iOS GIF 格式动画 图片显示
  • 原文地址:https://www.cnblogs.com/xiaodi/p/138755.html
Copyright © 2011-2022 走看看