首页 > 数据库 >MySQL的varchar定义长度到底是字节还是字符,varchar字符长度的计算

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

时间:2023-02-20 15:34:01浏览次数:37  
标签:字符 varchar 字节 str 长度 name

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 

标签:字符,varchar,字节,str,长度,name
From: https://www.cnblogs.com/jelly12345/p/17137638.html

相关文章

  • 算法之字符串
    字符串字符串--反转字符串题目:力扣题目链接(opensnewwindow)编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。不要给另外的......
  • java 判断字符串是否为空的四种方法
    以下是java判断字符串是否为空的四种方法:方法一:最多人使用的一个方法,直观,方便,但效率很低:if(s==null||s.equals(""));方法二:比较字符串长度,效率高,是我......
  • javaEE007.03 JSP简介、helloworld、运行原理(包含新建JSP、默认字符设置 C#中叫aspx)
    系列文章目录文章目录​​系列文章目录​​​​前言​​​​一、JSP简介​​​​简介​​​​二、helloworld——怎么写java代码​​​​二、、运行原理​​​​总结​​......
  • java环境搭建问题之——此环境变量太大。此对话框允许将值设置为最长2047个字符。“
    系列文章目录文章目录​​系列文章目录​​​​前言​​​​一、解决办法​​​​办法二​​前言安装完jdk1.8,之后,要添加环境变量,之前添加都没事,突然就加不了了,情况很急,这......
  • java如何用split()分割字符串
    String.split()分割字符串的总结:1.字符"|","*","+"都得加上转义字符,前面加上"\\"。2.而如果是"\",那么就得写成"\\\\"。3.如果一个字符串中有多个分隔符,可以用"|"作为连字......
  • Es6 新增的字符串方法
    1.String.fromCodePoint()ES5提供String.fromCharCode()方法,用于从Unicode码点返回对应字符,但是这个方法不能识别码点大于0xFFFF的字符。String.fromCharCode(0x2......
  • 字符串变量初始化
    importre#解析字符串中全局变量并进行替换defresolve_global_var(pre_resolve_var,global_var_dic,global_var_regex='\${.*?}',match2key_s......
  • 对称美学,对称字符串
    时间限制:1s空间限制:256MB限定语言:不限题目描述:对称就是最大的美学,现有一道关于对称字符串的美学。已知:第1个字符串:R第2个字符串:BR第3个字符串:RBBR第4个字......
  • 指针和字符串基础知识
    #include"stdafx.h"intmain(intargc,char*argv[]){//定义字符串的第一种方式,此种定义的字符可修改chara[]="it";a[0]='T';printf("%s\n",a);//定义字......
  • C字符串基础
    #include<string.h>#include<stdio.h>intmain(){charname[]="mhm";charname2[]={'1','2'};printf("%s\n",name);//mhmprintf(......