MySQL的varchar定义长度到底是字节还是字符,varchar字符长度的计算

1.在开始之前先简单介绍下字符和字节的区别:

  • 字符 人们使用的记号,抽象意义上的一个符号。一个汉字和英文就是一个字符,如'1', '中', 'a', '$', '¥',……
  • 字节 计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间,如0x01, 0x45, 0xFA,……

2.环境:CentOS7.x,MySQL5.7.x
2.1 utf8字符集下:

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL DEFAULT '' COMMENT '用户名',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

添加数据(截图):

 

查询数据:

select  id,name,length(name),char_length(name) from test 

说明:
utf-8编码  1个中文字符=3个字节    1个字节=8个位
一个英文字母字符存储需要1个字节

LENGTH(str) 返回字符串str的长度,以字节为单位
CHAR_LENGTH(str)  返回字符串str的长度,以字符为单位

2.2 GBK字符集

CREATE TABLE `test_gbk` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(10) CHARACTER SET gbk COLLATE gbk_bin NOT NULL DEFAULT '' COMMENT '用户名',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;

添加数据(截图):

 

查询数据:

select  id,name,length(name),char_length(name) from test_gbk

说明:
    gbk编码  1个中文字符=2个字节    1个字节=8个位
    一个英文字母字符存储需要1个字节
    
    LENGTH(str) 返回字符串str的长度,以字节为单位
    CHAR_LENGTH(str)  返回字符串str的长度,以字符为单位

由此可见,varchar定义的长度的单位是字符,哪怕是1个多字节字符也是1个字符,如中文和英文字母都被当作1个字符来对待。那么**varchar能够定义的最大长度是多少呢?**这个和你当前所使用的字符集有关。抛开字符,其最大长度为65535字节(这是最大行大小,由所有列共享),而放在不同的字符集下,能够定义的最大长度就会有所不同,如UTF8下是21845。据说MySQL5中varchar的长度也为字符,而MySQL4中的则为字节,未经证实,感兴趣的有环境可以自己测下。顺便补充一下,char数据类型定义的长度也为字符,其最大长度为255。
3.varchar存储规则:

  • 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
  • 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节

3.1 编码长度限制:

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766【32766*2=65532字节】;
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845【21845*3=65535字节】;

3.2 varchar和char 的区别:

  • char是一种固定长度的类型
  • varchar则是一种可变长度的类型

区别:
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)
在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).
在MySQL中用来判断是否需要进行对据列类型转换的规则:

  1. 在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.
  2. 只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.
  3. 如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.例外:长度小于4个字符的char数据列不会被转换为varchar类 

参考文档:https://blog.csdn.net/yinjinshui/article/details/102496340 

posted @ 2023-02-20 15:29  郭慕荣  阅读(1968)  评论(0编辑  收藏  举报