<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 27,  comments - 37,  trackbacks - 0
    SQL中char、varchar、text和nchar、nvarchar、ntext的區別
         1、CHAR。CHAR存儲定長數據很方便,CHAR字段上的索引效率級高,比如定義char(10),那么不論你存儲的數據是否達到了10個字節,都要占去10個字節的空間。
         2、VARCHAR。存儲變長數據,但存儲效率沒有CHAR高。如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。為什么“+1”呢?這一個字節用于保存實際使用了多大的長度。
        從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際情況找到權衡點。
        3、TEXT。text存儲可變長度的非Unicode數據,最大長度為2^31-1(2,147,483,647)個字符。
         4、NCHAR、NVARCHAR、NTEXT。這三種從名字上看比前面三種多了個“N”。它表示存儲的是Unicode數據類型的字符。我們知道字符中,英文字符只需要一個字節存儲就足夠了,但漢字眾多,需要兩個字節存儲,英文與漢字同時存在時容易造成混亂,Unicode字符集就是為了解決字符集這種不兼容的問題而產生的,它所有的字符都用兩個字節表示,即英文字符也是用兩個字節表示。nchar、nvarchar的長度是在1到4000之間。和char、varchar比較起來,nchar、nvarchar則最多存儲4000個字符,不論是英文還是漢字;而char、varchar最多能存儲8000個英文,4000個漢字??梢钥闯鍪褂胣char、nvarchar數據類型時不用擔心輸入的字符是英文還是漢字,較為方便,但在存儲英文時數量上有些損失。
         所以一般來說,如果含有中文字符,用nchar/nvarchar,如果純英文和數字,用char/varchar。






    數據庫定義到char類型的字段時 char、nchar、varchar、nvarchar、text、ntext中哪一種呢
     數據庫定義到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位的數據

    這樣一來,生活是不是變成美好多了? 如果還有沒明白的,那么還是省點錢去買蘿卜吧。


     小時候家的對面有一座山,山的上面就是藍天,所以總是幻想著有一天站到山頂用手摸一下藍天……
    posted on 2008-04-14 22:21 丫丫 閱讀(3716) 評論(2)  編輯  收藏 所屬分類: 資料網摘


    FeedBack:
    # re: SQL中char、varchar、text和nchar、nvarchar、ntext的區別
    2008-07-08 16:40 | ppxmdeng
    hehe,感覺好像是在坐辯護律師。不過內容我覺得不錯。Thank you   回復  更多評論
      
    # re: SQL中char、varchar、text和nchar、nvarchar、ntext的區別
    2014-08-06 17:38 | 12
    wq  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2014年8月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    常用鏈接

    留言簿(1)

    隨筆分類(25)

    隨筆檔案(27)

    文章分類

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产成人久久精品99| 曰批视频免费30分钟成人| JLZZJLZZ亚洲乱熟无码| 老牛精品亚洲成av人片| 在线免费视频一区二区| 精品国产成人亚洲午夜福利| 亚洲成人免费网站| 青青草原精品国产亚洲av| 亚洲欧洲免费视频| 亚洲天堂中文字幕| 真人做人试看60分钟免费视频 | 黄网址在线永久免费观看 | 日韩亚洲人成在线综合日本| 手机永久免费的AV在线电影网| 在线观看免费宅男视频| 亚洲乱码中文字幕在线| 卡1卡2卡3卡4卡5免费视频| 亚洲国产精品无码观看久久| 永久久久免费浮力影院| 校园亚洲春色另类小说合集| 日本免费无遮挡吸乳视频电影| 高潮毛片无遮挡高清免费视频| 免费一级毛片在线播放不收费| 四虎影视久久久免费| 亚洲成AV人片在线观看| 免费看男女下面日出水来| tom影院亚洲国产一区二区| 欧洲精品成人免费视频在线观看| 亚洲av永久无码精品秋霞电影秋| 国内自产拍自a免费毛片| 免费人成大片在线观看播放| 亚洲成人一区二区| 亚洲成人动漫在线| 69式互添免费视频| 亚洲av无码av在线播放| 亚洲人成色7777在线观看不卡| 麻豆精品成人免费国产片| 亚洲人xxx日本人18| 亚洲一级片免费看| 在线日本高清免费不卡| 美女的胸又黄又www网站免费|