數據庫學習筆記(一)----CHAR,VARCHAR和NVARCHAR

1. charmysql

     固定長度,最長n個字符。sql


2. varchar數據庫

     最大長度爲n的可變字符串。oracle

(n爲某一整數,不一樣數據庫,最大長度n不一樣)sqlserver


char和varchar區別:性能

     varchar必char節省空間,但在效率上比char稍微差一些。大數據

     說varchar比char節省空間,是由於varchar是可變字符串,好比:用varchar(5)存儲字符串「abc」,只佔用3個字節的存儲空間,而用char(5)存儲,則佔用5個字節(「abc  」)。編碼

     說varchar比char效率稍差,是由於,當修改varchar數據時,可能由於數據長度不一樣,致使數據遷移(即:多餘I/O)。其中,oracle對此多餘I/O描述的表達是:「行遷移」(Row Migration)。spa


「行遷移」(Row Migration):指針

      「當一行的記錄初始插入時是能夠存儲在一個block中的,因爲更新操做致使行增長了,而block的自由空間已經徹底滿了,這個時候就產生了行遷移。在這種狀況下,oracle將會把整行數據遷移到一個新的block中,oracle會保留被遷移的行的原始指針指向新的存放行數據的block,這就意味着被遷移行的ROW ID是不會改變的。"

     其中要解釋一下:block是oracle中最小的數據組織與管理單位,是數據文件磁盤儲存空間單位,也是數據庫I/O最小單位(也就是說,讀和寫都是一個block打大小,因此若是block沒滿時,更新內容長度變動的varchar字段,和更新內容長度沒變的varchar字段,I/O次數是同樣,不存在額外消耗,只有在block滿時,纔會出現額外I/O,因此char和varchar性能之間的性能差別,是至關細微的,絕大多數狀況下能夠忽略不計,因此上文描述的「稍」差的含義)

     因此,個人開發經驗是:「用varchar徹底代替char吧,沒什麼好顧慮的」。


3. nvarchar

     nvarchar的特性,須要和varchar對比。

     nvarchar和varchar的不一樣主要是在對於數據的存儲方式上:

     1). varchar:按字節存儲數據

          varchar(6),最多能存儲6個字節的數據,好比:「哈哈哈」,「abcdef」......

備註:一箇中文字符在數據庫裏佔多少個字節,要看unicode的編碼方式,好比:utf8在mysql上佔3個字節,sqlserver的Chinese_PRC_CI_AS佔2個字節...

     2). nvarchar:按字符存儲數據

          nvarchar(6),最多能存儲6個字符/中文數據,好比:"哈哈哈哈哈哈",「abcdef」......

          nvarchar(m)最大存儲的實際字節長度=n*m(n跟據編碼方式而定),若是nvarchar存儲的是英文字符,也是根據編碼方式存儲n的字節長度。也就是說,若是nvarchar存儲英文字符,會浪費一半以上的存儲空間....

          

總結:

     1. char和varchar的性能差距是很小的,能夠考慮忽略不計。

     2. 在大數據量應用中,使用char和nvarchar有可能致使大量的存儲空間的浪費。

相關文章
相關標籤/搜索