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

    也就是说一个汉字既可以存在varchar中,也可以存在nvarchar中.
    那么对于汉字或者Unicode 数据到底存在varchar和nvarchar有什么区别呢?
    下面例子说明一下:一个汉字占varchar(2),只占nvarchar(1),而字母只占varchar(1),那么在数据库字段求长度的时候,用varchar你就不一定知道它确切的知道它到底有几个字,如果用nvarchar,那么汉字也是nvarchar(1),字母也是nvarchar(1),那么已经很明显了.
    区别2:varchar的检索快于nvarchar

    Unicode 数据类型需要相当于非 Unicode   数据类型两倍的存储空间,

    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类型就这么一点好处。


    字段类型 描述
     bit  0或1的整型数字
     int  从-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型数字
     smallint  从-2^15(-32,768)到2^15(32,767)的整型数字
     tinyint  从0到255的整型数字
       
     decimal  从-10^38到10^38-1的定精度与有效位数的数字
     numeric  decimal的同义词
       
     money  从-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的货币数据,最小货币单位千分之十
     smallmoney  从-214,748.3648到214,748.3647的货币数据,最小货币单位千分之十
       
     float  从-1.79E+308到1.79E+308可变精度的数字
     real  从-3.04E+38到3.04E+38可变精度的数字
       
     datetime  从1753年1月1日到9999年12日31的日期和时间数据,最小时间单位为百分之三秒或3.33毫秒
     smalldatetime  从1900年1月1日到2079年6月6日的日期和时间数据,最小时间单位为分钟
       
     timestamp  时间戳,一个数据库宽度的唯一数字
     uniqueidentifier  全球唯一标识符GUID
       
     char  定长非Unicode的字符型数据,最大长度为8000
     varchar  变长非Unicode的字符型数据,最大长度为8000
     text  变长非Unicode的字符型数据,最大长度为2^31-1(2G)
       
     nchar  定长Unicode的字符型数据,最大长度为8000
     nvarchar  变长Unicode的字符型数据,最大长度为8000
     ntext  变长Unicode的字符型数据,最大长度为2^31-1(2G)
       
     binary  定长二进制数据,最大长度为8000
     varbinary  变长二进制数据,最大长度为8000
     image  变长二进制数据,最大长度为2^31-1(2G)

  • 相关阅读:
    东拼西凑 vim配置-更新
    oh-my-zsh
    switch变种玩法
    每天一个linux命令(5):rm 命令
    每天一个linux命令(4):mkdir命令
    每天一个linux命令(3):pwd命令
    ES6学习之let
    Window.scrollTo()
    如何调整滚动条的样式
    移动端实现滚动的四种方案
  • 原文地址:https://www.cnblogs.com/meiproject/p/910350.html
Copyright © 2011-2022 走看看