MySQL中varchar與char區別(轉)

MySQL中varchar最大長度是多少?sql

一. varchar存儲規則:編碼

4.0版本如下,varchar(20),指的是20字節,若是存放UTF8漢字時,只能存6個(每一個漢字3字節)  5.0版本以上,varchar(20),指的是20字符,不管存放的是數字、字母仍是UTF8漢字(每一個漢字3字節),均可以存放20個,最大大小是65532字節  Mysql4中最大也不過是20個字節,可是Mysql5根據編碼不一樣,存儲大小也不一樣。 spa

二. varchar和char 的區別:索引

區別一,定長和變長

char 表示定長,長度固定,varchar表示變長,即長度可變。當所插入的字符串超出它們的長度時,視狀況來處理,若是是嚴格模式,則會拒絕插入並提示錯誤信息,若是是寬鬆模式,則會截取而後插入。若是插入的字符串長度小於定義長度時,則會以不一樣的方式來處理,如char(10),表示存儲的是10個字符,不管你插入的是多少,都是10個,若是少於10個,則用空格填滿。而varchar(10),小於10個的話,則插入多少個字符就存多少個。 varchar怎麼知道所存儲字符串的長度呢?實際上,對於varchar字段來講,須要使用一個(若是字符串長度小於255)或兩個字節(長度大於255)來存儲字符串的長度。可是由於他須要有一個prefix來表示他具體bytes數是多少(由於varchar是變長的,沒有這個長度值他不知道如何讀取數據)。字符串

區別之二,存儲的容量不一樣

對 char 來講,最多能存放的字符個數 255,和編碼無關。 而 varchar 呢,最多能存放 65532 個字符。VARCHAR 的最大有效長度由最大行大小和使用的字符集肯定。總體最大長度是 65,532字節字符編碼

 

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

一、在一個數據表裏,若是每個數據列的長度都是固定的,那麼每個數據行的長度也將是固定的.class

二、只要數據表裏有一個數據列的長度的可變的,那麼各數據行的長度都是可變的.sed

三、若是某個數據表裏的數據行的長度是可變的,那麼,爲了節約存儲空間,MySQL會把這個數據表裏的固定長度類型的數據列轉換爲相應的可變長度類型.例外:長度小於4個字符的char數據列不會被轉換varchar類型im

三. MySQL中varchar最大長度是多少?

這不是一個固定的數字。先簡要說明一下限制規則。

一、限制規則

字段的限制在字段定義的時候有如下規則:

a) 存儲限制

varchar 字段是將實際內容單獨存儲在聚簇索引以外,內容開頭用1到2個字節表示實際長度(長度超過255時須要2個字節),所以最大長度不能超過65535字符。

b) 編碼長度限制

字符類型若爲gbk,每一個字符最多佔2個字節,最大長度不能超過32766;

字符類型若爲utf8,每一個字符最多佔3個字節,最大長度不能超過21845。

若定義的時候超過上述限制,則varchar字段會被強行轉爲text類型,併產生warning。

c) 行長度限制

致使實際應用中varchar長度限制的是一個行定義的長度。 MySQL要求一個行的定義長度不能超過65535bytes。若定義的表長度超過這個值,則提示

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。

由字符集來肯定,字符集分單字節和多字節 Latin1 一個字符佔一個字節,最多能存放 65532 個字符 GBK 一個字符佔兩個字節, 最多能存 32766 個字符 UTF8 一個字符佔三個字節, 最多能存 21844 個字符 注意,char 和 varchar 後面的長度表示的是字符的個數,而不是字節數。

二、計算例子

舉兩個例說明一下實際長度的計算。

a) 若一個表只有一個varchar類型,如定義爲

create table t4(c varchar(N)) charset=gbk;

則此處N的最大值爲(65535-1-2)/2= 32766 個字符。

減1的緣由是實際行存儲從第二個字節開始’;

減2的緣由是varchar頭部的2個字節表示長度;

除2的緣由是字符編碼是gbk。

b) 若一個表定義爲

create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

則此處N的最大值爲 (65535-1-2-4-30*3)/3=21812

減1和減2與上例相同;

減4的緣由是int類型的c佔4個字節;

減30*3的緣由是char(30)佔用90個字節,編碼是utf8。

若是被varchar超過上述的b規則,被強轉成text類型,則每一個字段佔用定義長度爲11字節,固然這已經不是「varchar」了。

則此處N的最大值爲 (65535-1-2-4-30*3)/3=21812

create table t4(c int, c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8

相關文章
相關標籤/搜索