n的含義
根據網絡上找到的結果(不能保證准確),在5.0.3以后版本中,n均代表字符數,而不是字節數;我用來測試的版本是5.7.20,該版本中,n表示字符數。
驗證過程如下
建表
CREATE TABLE `teststring` ( `c` char(4) DEFAULT NULL, `v` varchar(4) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入數據並查詢數據長度
INSERT INTO teststring VALUES ('幻樂之城','幻樂之城') SELECT LENGTH(v),CHAR_LENGTH(v),LENGTH(c),CHAR_LENGTH(c) FROM teststring;
結果如下:
所需存儲空間
- char(n)需要固定的存儲空間,即當存入的字符長度小於n時,所需空間仍然是n個字符所需的存儲空間(由於字符編碼不確定,所以長度也無法確定);
- varchar(n)的所需存儲空間是隨字符長度而變化的,因為varchar類型存儲了當前字符的長度;
varchar最大數據長度
- mysql的vachar字段的類型最大長度是65535,但實際存儲的數據長度要小於該值;
- 當數據長度小於255時,數據庫采用1個字節記錄varchar數據長度,當數據長度>255時,需要用兩個字節存儲長度;
- NULL標識位,如果varchar字段定義中帶有default null允許列空,則需要需要1bit來標識,每8個bits的標識組成一個字段。一張表中存在N個varchar字段,那么需要(N+7)/8 (取整)bytes存儲所有的NULL標識位
- 如果表中varchar類型不可以為null,則最大數據長度可以到65533
- 如果數據表只有一個varchar字段且該字段DEFAULT NULL,那么該varchar字段的最大長度為65532個字節,即65535-2-1=65532 byte;
- 如果表中所有varchar字段均為not null 則最大數據長度可為65533
-
- varchar 的最大長度受限於最大行長度(max row size,65535bytes),假如create table tt(age int,addr varchar(N) default null) charset=utf8 則addr字段N的最大值為(65535-1-2-4)/3,1是因為null標志,2是因為存儲長度值,4是因為int子段和行長度限制
- 可存儲的最大字符數和字符編碼有關,如當采用utf8編碼時,一個數字或字母占1個字節,一個漢字占3個字節;
- 可參考https://dev.mysql.com/doc/refman/5.7/en/char.html
char最大數據長度
- char類型字段的最大長度是255,且255個字節可全部用於存儲數據;
- 由於char類型沒有記錄數據長度,所以導致其尾部的空格在存儲時會被去掉;
- 如果某個長度小於n,MySQL就會在它的右邊用空格字符補足.(在檢索操作中那些填補出來的空格字符將被去掉)
參考:
http://www.cnblogs.com/gomysql/p/3615897.html