CHAR和VARCHAR
CHAR和VARCHAR類型聲明的長度表示你想要保存的最大字符數
char 0~255 尾部填充空格到指定長度,檢索時自動去掉空格。
varchar 0~65535
VARCHAR值保存時只保存需要的字符數,另加一個字節來記錄長度(如果列聲明的長度超過255,則使用兩個字節)。
不進行空格填充
注意
受限於mysql單行最大字節(InnoDB,65535),考慮到編碼
如果為latin1,則varchar最大為 65535-2-1=65532(null標志位占用一個字節,長度最大占用兩個字節)
如果為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