CHAR和VARCHARhtml
CHAR和VARCHAR類型聲明的長度表示你想要保存的最大字符數mysql
char 0~255 尾部填充空格到指定長度,檢索時自動去掉空格。sql
varchar 0~65535ui
VARCHAR值保存時只保存須要的字符數,另加一個字節來記錄長度(若是列聲明的長度超過255,則使用兩個字節)。編碼
不進行空格填充spa
注意code
受限於mysql單行最大字節(InnoDB,65535),考慮到編碼htm
若是爲latin1,則varchar最大爲 65535-2-1=65532(null標誌位佔用一個字節,長度最大佔用兩個字節)blog
若是爲utf-8,則varchar最大爲 65532/3 = 21844,雖然理論值爲 65535/3=21845排序
綜上,若是varchar的數值過大,應該採用text類型,該類型能夠存儲65535個字符。
參考:
https://stackoverflow.com/questions/332798/equivalent-of-varcharmax-in-mysql
https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html
全部MySQL校對規則屬於PADSPACE類。
這說明在MySQL中的全部CHAR和VARCHAR值比較時不須要考慮任何尾部空格
BINARY和VARBINARY
沒有字符集,而且排序和比較基於列值字節的數值值
BINARY和VARBINARY容許的最大長度同樣
長度是字節長度而不是字符長度
binary:填充值是0x00(零字節),插入填充,取出不剪裁
varbinary:不填充、不剪裁
若是檢索的值必須與指定進行存儲而沒有填充的值相同,最好使用BLOB數據類型。
BLOB和TEXT類型
BLOB 列被視爲二進制字符串(字節字符串)。
BLOB列沒有字符集,而且排序和比較基於列值字節的數值值。
TEXT列被視爲非二進制字符串(字符字符串)。
TEXT列有一個字符集,而且根據字符集的 校對規則對值進行排序和比較。
在大多數方面,能夠將BLOB列視爲可以足夠大的VARBINARY列。一樣,能夠將TEXT列視爲VARCHAR列
BLOB和TEXT在如下幾個方面不一樣於VARBINARY和VARCHAR:
當保存或檢索BLOB和TEXT列的值時不刪除尾部空格。(這與VARBINARY和VARCHAR列相同)。
對於BLOB和TEXT列的索引,必須指定索引前綴的長度。對於CHAR和VARCHAR,前綴長度是可選的。
BLOB和TEXT列不能有 默認值。
排序時也要指定參與排序的長度。(max_sort_length)
對於BLOB和TEXT列的索引,必須指定索引前綴的長度。對於CHAR和VARCHAR,前綴長度是可選的。
BLOB和TEXT類須要 1、2、3或者4個字節來記錄列值的長度,取決於該類的最大可能的長度
列類型存儲需求
MyISAM表中行的最大大小爲65,534字節(innodb 65535)。每一個BLOB和TEXT列 帳戶只佔其中的5至9個字節
要想計算用於保存具體CHAR、VARCHAR或者TEXT列值的字節數,須要考慮該列使用的字符集。
字符串類型的存儲需求
列類型 |
存儲需求 |
CHAR(M) |
M個字節,0 <= M <= 255 |
VARCHAR(M) |
L+1個字節,其中L <= M 且0 <= M <= 65535(參見下面的註釋) |
BINARY(M) |
M個字節,0 <= M <= 255 |
VARBINARY(M) |
L+1個字節,其中L <= M 且0 <= M <= 255 |
TINYBLOB, TINYTEXT |
L+1個字節,其中L < 28 |
BLOB, TEXT |
L+2個字節,其中L < 216 |
MEDIUMBLOB, MEDIUMTEXT |
L+3個字節,其中L < 224 |
LONGBLOB, LONGTEXT |
L+4個字節,其中L < 232 |
ENUM('value1','value2',...) |
1或2個字節,取決於枚舉值的個數(最多65,535個值) |
SET('value1','value2',...) |
1、2、3、4或者8個字節,取決於set成員的數目(最多64個成員) |
VARCHAR、BLOB和TEXT類是變長類型。每一個類型的存儲需求取決於列值的實際長度(用前面的表中的L表示),而不是該類型的最大可能的大小。例如,VARCHAR(10)列能夠容納最大長度爲10的字符串。實際存儲需求是字符串(L)的長度,加上一個記錄字符串長度的字節。對於字符串'abcd',L是4,存儲須要5個字節。
對於CHAR、VARCHAR和TEXT類型,前面的表中的值L和M應解釋爲字符數目,而且列定義中的這些類型的長度表示字符數目。例如,要想保存一個TINYTEXT值須要L字符+ 1個字節。
要想計算用於保存具體CHAR、VARCHAR或者TEXT列值的字節數,須要考慮該列使用的字符集。在具體狀況中,當使用Unicode時,必須記住全部Unicode字符使用相同的字節數。爲了細分用於不一樣類Unicode字符使用的存儲,參見10.5節,「Unicode支持」。
註釋:VARCHAR列的有效最大長度爲65,532字符。
參考
mysql手冊 列類型-string類型章節
http://www.cnblogs.com/gomysql/p/3615897.html