1. 程式人生 > >varchar和char區別

varchar和char區別

區別一,定長和變長

char 表示定長,長度固定,varchar表示變長,即長度可變
當所插入的字串超出它們的長度時,視情況來處理,如果是嚴格模式,則會拒絕插入並提示錯誤資訊,如果是寬鬆模式,則會擷取然後插入。如果插入的字串長度小於定義長度時,則會以不同的方式來處理,如char(10),表示儲存的是10個字元,無論你插入的是多少,都是10個,如果少於10個,則用空格填滿。而varchar(10),小於10個的話,則插入多少個字元就存多少個。varchar怎麼知道所儲存字串的長度呢?實際上,對於varchar欄位來說,需要使用一個(如果字串長度小於255)或兩個位元組(長度大於255)來儲存字串的長度。


區別之二,儲存的容量不同

對char來說,最多能存放的字元個數 255,和編碼無關。
而varchar呢,最多能存放 65532 個字元。
VARCHAR的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是65,532位元組
最大有效長度是 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的最大值又是多少?(65535 - 1 - 2 - 4 - 30 * 3 )/3 (字元)
減4的原因是int型別的c佔4個位元組;減30*3的原因是char(30)佔用90個位元組,編碼是utf8。


     MySQL要求varchar一個行的定義長度不能超過65535。若定義的表長度超過這個值,併產生warning。並被強轉成text型別。

在MySQL中用來判斷是否需要進行對據列型別轉換的規則


1、在一個數據表裡,如果每一個數據列的長度都是固定的,那麼每一個數據行的長度也將是固定的.


2、只要資料表裡有一個數據列的長度的可變的,那麼各資料行的長度都是可變的.


3、如果某個資料表裡的資料行的長度是可變的,那麼,為了節約儲存空間,MySQL會把這個資料表裡的固定長度型別的資料列轉換為相應的可變長度型別.例外:長度小於4個字元的char資料列不會被轉換為varchar型別


MySQL中varchar最大長度是多少?這不是一個固定的數字。本文簡要說明一下限制規則。



欄位的限制在欄位定義的時候有以下規則:


儲存限制

varchar 欄位是將實際內容單獨儲存在聚簇索引之外,內容開頭用1到2個位元組表示實際長度(長度超過255時需要2個位元組),因此最大長度不能超過65535。


編碼長度限制
字元型別若為gbk,每個字元最多佔2個位元組,最大長度不能超過32766;
字元型別若為utf8,每個字元最多佔3個位元組,最大長度不能超過21845。
若定義的時候超過上述限制,則varchar欄位會被強行轉為text型別,併產生warning。
 
行長度限制
導致實際應用中varchar長度限制的是一個行定義的長度。 MySQL要求一個行的定義長度不能超過65535。若定義的表長度超過這個值,則提示
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。