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