MySQL字段類型VARCHAR

varchar(n),n表示什麼

  • MySQL5.0.3以前varchar(n)這裏的n表示字節數
  • MySQL5.0.3以後varchar(n)這裏的n表示字符數,好比varchar(200),無論是英文仍是中文均可以存放200個

VARCHAR字段限制緣由

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

  • a) 存儲限制 varchar字段是將實際內容單獨存儲在聚簇索引以外,內容開頭用1到2個字節表示實際長度(長度超過255時須要2個字節),所以最大長度不能超過65535。
  • b) 編碼長度限制 字符類型若爲gbk,每一個字符最多佔2個字節,最大長度不能超過32766; 字符類型若爲utf8,每一個字符最多佔3個字節,最大長度不能超過21845。 對於英文比較多的論壇 ,使用GBK則每一個字符佔用2個字節,而使用UTF-8英文卻只佔一個字節。 若定義的時候超過上述限制,則varchar字段會被強行轉爲text類型,併產生warning。
  • c) 行長度限制 致使實際應用中varchar長度限制的是一個行定義的長度。 MySQL要求一個行的定義長度不能超過65535。 若定義的表長度超過這個值,則提示「ERROR 1118 (42000): Row size too large. 」

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

  • a) 若一個表只有一個varchar類型,如定義爲 create table t4(c varchar(N)) charset=gbk; 則此處N的最大值爲(65535-1-2)/2= 32766。 減1的緣由是實際行存儲從第二個字節開始; 減2的緣由是varchar頭部的2個字節表示長度; 除2的緣由是字符編碼是gbk。spa

  • b) 若一個表定義爲 create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8; 則此處N的最大值爲 (65535-1-2-4-303)/3=21812 減1和減2與上例相同; 減4的緣由是int類型的c佔4個字節; 減303的緣由是char(30)佔用90個字節,編碼是utf8。 若是被varchar超過上述的b規則,被強轉成text類型,則每一個字段佔用定義長度爲11字節,即字段再也不是「varchar」。索引