mysql中字符串類型char(n)和varchar(n)的區別


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;

結果如下:

所需存儲空間

  1. char(n)需要固定的存儲空間,即當存入的字符長度小於n時,所需空間仍然是n個字符所需的存儲空間(由於字符編碼不確定,所以長度也無法確定);
  2. varchar(n)的所需存儲空間是隨字符長度而變化的,因為varchar類型存儲了當前字符的長度;

varchar最大數據長度

  1. mysql的vachar字段的類型最大長度是65535,但實際存儲的數據長度要小於該值;
  2. 當數據長度小於255時,數據庫采用1個字節記錄varchar數據長度,當數據長度>255時,需要用兩個字節存儲長度;
  3. NULL標識位,如果varchar字段定義中帶有default null允許列空,則需要需要1bit來標識,每8個bits的標識組成一個字段。一張表中存在N個varchar字段,那么需要(N+7)/8 (取整)bytes存儲所有的NULL標識位
  4. 如果表中varchar類型不可以為null,則最大數據長度可以到65533
  5. 如果數據表只有一個varchar字段且該字段DEFAULT NULL,那么該varchar字段的最大長度為65532個字節,即65535-2-1=65532 byte;
    •  
    •  

  6. 如果表中所有varchar字段均為not null 則最大數據長度可為65533
    •   

       

  7. 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子段和行長度限制
    •  

    •  

  8. 可存儲的最大字符數和字符編碼有關,如當采用utf8編碼時,一個數字或字母占1個字節,一個漢字占3個字節;
  9. 可參考https://dev.mysql.com/doc/refman/5.7/en/char.html

char最大數據長度

  1. char類型字段的最大長度是255,且255個字節可全部用於存儲數據;
  2. 由於char類型沒有記錄數據長度,所以導致其尾部的空格在存儲時會被去掉;
  3. 如果某個長度小於n,MySQL就會在它的右邊用空格字符補足.(在檢索操作中那些填補出來的空格字符將被去掉)

 

  

 

參考:

http://www.cnblogs.com/gomysql/p/3615897.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM