1. 程式人生 > >varchar與char的區別

varchar與char的區別

1 定長 VS 變長 
char表示定長,長度固定,varchar表示變長,即長度可變

當插入資料的長度超過定義的長度時,如果資料庫是嚴格模式,則會拒絕插入並提示錯誤資訊,如果是寬鬆模式,則會擷取然後插入。如果插入的字串長度小於定義長度時如char(10),表示儲存的是10個字元,無論你插入多少都是10個,如果少於10個,則用空格填滿。而varchar(10),小於10個的話,則插入多少個字元就存多少。

varchar如何知道所儲存字串的長度呢?實際上,對於varchar欄位來說,需要使用一個(如果字串長度小於255)或兩個位元組(長度大於255)來儲存字串的長度。

2 儲存的容量不同 
對於char來說,最多能存放的字元個數255,和編碼無關。 
而varchar最多能存放65532個字元 
varchar的最大有效長度由最大行大小和使用的字符集確定。 
why 65532? 在varchar存字串的時候,第一個位元組是空的,不存任何資料,然後還需要兩個位元組來存放字串的長度。所以有效長度就是65535-1-2 = 65532. 
Latin1 一個字元佔一個位元組,最多能存放65532個字元 
GBK 一個字元佔兩個位元組,最多能存32766個字元 
UTF8 一個字元佔三個位元組,最多能存21844個字元

注意,char和varchar後面的長度表示的是字元的個數,而不是位元組數。 
兩相比較,char的效率高,沒有碎片,尤其更新比較頻繁的時候,方便資料檔案指標的操作。但不夠靈活

擴充套件 
若一個表定義為create table t1(c int, c2 char(30), c3 varchar(N)) charset=utf8;問N的最大值為多少? 
int 佔 4個位元組 
char 佔 30 *3 個位元組 
則N = ((65535-1-2)-4-30*3)/3