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

 

转载于:https://www.cnblogs.com/canger/p/9845969.html

你可能感兴趣的:(数据库)