UTF-8編碼中,一個英文字符等於一個字節,一個中文(含繁體)等於三個字節。
Unicode編碼中,一個英文等於兩個字節,一個中文(含繁體)等於兩個字節。
在MySQL中用來判斷是否需要進行對數據列類型轉換的規則
-
在一個數據表里,如果每一個數據列的長度都是固定的,那么每一個數據行的長度也將是固定的.
-
只要數據表里有一個數據列的長度的可變的,那么各數據行的長度都是可變的.
-
如果某個數據表里的數據行的長度是可變的,那么,為了節約存儲空間,MySQL會把這個數據表里的固定長度類型的數據列轉換為相應的可變長度類型.例外:長度小於4個字符的char數據列不會被轉換varchar類型
在mysql中,char和varchar都表示字符串類型.但他們存儲和檢索數據的方式並不相同.
在表結構定義中聲明char和varchar類型時,必須指定字符串的長度.也就是該列所能存儲多少個字符(不是字節,是字符).例如:char(10)和varchar(10)都能存儲10個字符.
聲明為char的列長度是固定的,char的長度可選范圍在0-255之間.也就是char最大能存儲255個字符.如果該列是utf8編碼,則該列所占用的字節數=字符數3.如果是gbk編碼則該列所占用的字節數=字符數2.
聲明為varchar的列長度是可變的,mysql5.7.2 varchar的長度范圍為0-65535個字節.采用varchar類型存儲數據需要1-2個字節(長度超過255時需要2個字節)來存儲字符串的實際長度.如果該列的編碼為gbk,每個字符最多占用2個字節,最大長度不能超過32766個字符.如果該列的編碼為utf8,每個字符最多占3個字節,最大字符長度為21845.
總結:
-
char和varchar最大的不同就是一個是固定長度,一個是可變長度.由於是可變長度,因此存儲的是實際字符串再加上一個記錄字符串長度的字節。如果分配給char或varchar列的值超過 列的最大長度,則對值進行裁剪.
-
varchar(M)和char(M),M都表示字符數.varchar的最大長度為65535個字節(字符長度為utf8下21845),不同的編碼所對應的最大可存儲的字符數不同.char最多可以存放255個字符,不同的編碼最大可用字節數不同.
GBK下: 若一個表只有一個varchar類型,如定義為
create table t4(c varchar(N)) charset=gbk;
則此處N的最大值為(65535-1-2)/2= 32766。
減1的原因是實際行存儲從第二個字節開始’;
減2的原因是varchar頭部的2個字節表示長度;
除2的原因是字符編碼是gbk。
UTF8下:
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。