为什么有些MySQL数据类型需要一些额外的字节?

Var*_*Agw 2 mysql size

在此输入图像描述

我正在阅读MySQL数据类型的大小.我看到VARCHAR需要额外的1/2字节,MEDIUMTEXT需要额外的3个字节,LONGTEXT需要额外的4个字节.这种MySQL行为的原因是什么?

Gor*_*off 5

当MySQL(或任何数据库或计算机语言)存储可变长度字符串时,基本上有两种方法来存储该值:

  • 可以编码长度,然后编码字符串中的字符
  • 字符串的结尾可以用特殊字符标记(通常'0')

数据库(差不多?)总是使用长度编码.因此,当您存储'ABC'为可变长度字符串时,在数据库存储中它看起来像:

3  A  B  C
Run Code Online (Sandbox Code Playgroud)

存储时'A':

1  A
Run Code Online (Sandbox Code Playgroud)

这样,MySQL知道一个字符串何时结束而下一个字符串何时开始.不同类型的不同长度基于字符串的最大长度.因此,1个字节可以保存0到255之间的值.2个字节可以保存0到65,535之间的值,依此类推.

当你使用常规字符表达式时char(3),那么'ABC'看起来像:

A   B   C
Run Code Online (Sandbox Code Playgroud)

这占用三个字节/无论什么(取决于字符编码).从表元数据中可以知道长度.

有了char(3),字符串'A'也占用三个插槽:

A        
---^space here
--------^space here
Run Code Online (Sandbox Code Playgroud)

额外的两个被空格占据.对于长字符串,这通常是一个很大的空间浪费,这就是为什么大多数字符串存储varchar而不是存储char.