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;
结果如下:
所需存储空间
- 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