一、varchar和char的區別:
區別一:定長和變長
char表示定長、長度固定,varchanr表示變長,即長度可變。
- 即char類型是規定多少字長則必須存儲多少字長,超過的長度的字段則只能截取出對應的長度進行存儲,相對於要求字長長度不夠的字段則用空格補齊。
- 而varchar類型則是只要在規定字長之內,有多少存多少,無需補齊;超出的部分和char一樣,舍去即可。(由perfix來實現)
區別二:存儲容量不同
- 對於char類型來說,最多只能存放的字符個數為255,和編碼無關。
- varchar最多能存放65532個字符。VARCHAR的最大有效長度由最大行大小和使用的字符集來確定。整體最大長度是65,532字節。
二、 在Mysql中用來判斷是否需要進行對據列類型轉換的規則
- 在一個數據列表里,如果每個數據列的長度都是固定的,那么每個數據列的寬度也是固定的。
- 只要數據列表里有一個數據列的長度可變,那么個數據列的長度都是可變的。
- 如果某個數據表里的某個數據行的長度是可變的,那么為了節約時間,Mysql會把這個數據庫里的固定長度類型轉換為可變長度類型。但是長度小於4的char類型不會轉換為varchar類型。
三、 Mysql中varchar的最大長度為多少?(這不是一個固定的數字)
1. 限制規則
-
- 存儲限制
- varchar字段是將實際內容存儲在聚簇索引之外,內容開頭用1到2個字節表示實際長度(長度超過255時需要2個字節),因此最大長度不能超過65535字符。
- 編碼長度限制
- 字符類型若為gbk,每個字符最多占2個字節,最大長度不能超過32766;
- 字符類型若為UTF8,每個字符最多占3字節,最大長度不能超過21845;
- 若定義的時候超過上述限制,則varchar會被強制轉換為text類型,並產生warning。
- 行長度限制
- 導致實際運用中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 后面的長度表示的是字符的個數,而不是字節數。
- 導致實際運用中varchar長度限制的是一個行定義的長度。Mysql要求一個行的定義長度不能超過65535bytes,若定義的表長度超過這個值,則提示:
- 存儲限制
2. 計算例子
-
- 若一個表只有一個varchar類型。其定義為 create table t4(c varchar(N)) charset=gbk; 則此處N的最大值為(65535-1-2)/2=32766個字符。
-
- 減1的原因是實際行存儲從第二個字節開始;
- 減2的原因是varchar頭部的兩個字節表示長度;
- 除2的原因是字符編碼是gbk
create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;則此處的最大值為(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
-
-