字节、字符的区别

1、字节

字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。

2、字符

字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。

3、占用关系

  • ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
  • UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
  • Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
  • 符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
  • UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
  • UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。

4、mysql varchar

varchar怎么存储

MySQL定义VARCHAR(M)最多可以是65535个字节,M表示的是**「字符数量」**,但是实际存储中并不能存储那么多字节。如果一个字段超过了65535个字节,可以选择使用TEXT或者BLOB类型。

当varchar存储的字符个数小于或等于255的时候,首部需要一个字节来记录字符的个数。当内容大于255的字符的时候,首部需要2个自己来保存长度。

varchar能存的最大字符长度

理论上,varchar能够存储65535个字节,但是由于首部会占用两个字节,因此这会让varchar可用的存储空间变成了65533字节。如果定义的列是非空话,那最大是65533,如果定义的列允许NULL,那么null会占用一个额外的字节,因此最大只能存储65532个字节。

字节并不等于字符长度,varchar括号里面跟着的是字符长度,如果字符集是utf8的话,每一个字符统一会占用3个字节的长度,不管是汉子还是英文字符,因此最大能够存储的长度是65533/3 = 21844。如果字符集是utf8mb4那最大存储长度就更小了,为65533/4=16383。

字符编码

VARCHAR能最多能存储多少真实数据跟字符编码集有关,最多能存储多少个字符是个上限值,实际存储不了那么多,要在上限值的基础上减一。

VARCHAR(M)最多能存储多少真实数据(也就是M的最大取值)跟字段采用的字符集有关,以下就拿字符集utf8、gbk、utf8mb4说明一下:

  • utf8字符集:MySQL中的utf8字符集跟标准的utf-8字符集是不同的。MySQL中的utf8字符集一个字符最多占3个字节,而标准的utf-8字符集是最多占4个字节。在字段允许为NULL的情况下,计算最多能存储多少真实数据的公式为(65535-2-1)÷3=21844,字段不允许为NULL的情况下,公式为(65535-2)÷3=21844.333,所以utf8字符集最多能存储21844个字符。
    由于字段允许为NULL就只占一个字节,在字符集最多占用字节数大于1的情况下,计算出来的结果中会有小数,小数最终也会被舍弃,所以就先不考虑字段是否允许为NULL值了。
  • gbk字符集:gbk字符集中一个字符最多占2个字节。最多能存储多少真实数据的公式为(65535-2)÷2=32766,所以M的最大值32766。
  • utf8mb4字符集:utf8mb4字符集中一个字符最多占用4个字节。最多能存储多少真实数据的公式为(65535-2)÷4=16383.25,小数舍弃就是最多能存储16383个字符。

报错

如果字段设置的长度超过了实际能存储的长度,MySQL就是报下面这个错误

复制代码
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs
相关推荐
jran-1 小时前
MySQL多表操作 查询&子查询&外键约束
数据库·mysql
看到代码头都是大的2 小时前
CentoOS7安装mysql 8.0.46
mysql
阿坤带你走近大数据4 小时前
DM达梦数据库的介绍
数据库·mysql·oracle·国产信创
数据库小学妹5 小时前
企业级数据库迁移实践:从Oracle到国产数据库的兼容性与实施策略
数据库·mysql·oracle·dba
qq_297574676 小时前
MySQL核心技术实战系列(第二篇):MySQL核心基础:库与表的增删改查(CRUD)实战
数据库·mysql
Irene19916 小时前
SQL示例:明辨窗口函数和聚合函数的使用和选择
mysql·oracle
数据库小学妹6 小时前
CDC实时数据同步:让数据库变更秒级流向大数据平台!
大数据·数据库·mysql·kafka·dba
XZ-0700016 小时前
MySQL-视图
数据库·mysql
C137的本贾尼7 小时前
查询进阶:排序、过滤与分页
数据库·mysql
青云计划7 小时前
MySQL技术文档
java·mysql