字节、字符的区别

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
相关推荐
阿乾之铭23 分钟前
Spring Boot中集成Redis与MySQL
spring boot·redis·mysql
大气层煮月亮2 小时前
python调用MySql详细步骤
数据库·mysql
Yawesh_best3 小时前
MySQL(5)【数据类型 —— 字符串类型】
android·mysql·adb
Code哈哈笑3 小时前
【MySQL 保姆级教学】详细讲解视图--(15)
数据库·mysql
x2lab3 小时前
国产化 ARM 环境mysql-mariadb 部署
arm开发·mysql·docker·mariadb
曾经的三心草5 小时前
Mysql之约束与事件
android·数据库·mysql·事件·约束
宋发元5 小时前
如何使用正则表达式验证域名
python·mysql·正则表达式
张某布响丸辣5 小时前
SQL中的时间类型:深入解析与应用
java·数据库·sql·mysql·oracle
路遇晚风6 小时前
力扣=Mysql-3322- 英超积分榜排名 III(中等)
mysql·算法·leetcode·职场和发展
WEIII8 小时前
MySQL 主从复制原理与搭建实践
后端·mysql·docker