本文将针对MySQL 中 varchar (N)类型字段的存储方式进行解释,主要是对字符和字节的关系的理解。
1. varchar (N) 中的 N
- varchar (N) 中的 N 表示字符数,而不是字节数。这意味着 `N` 表示你可以存储多少个字符。
字符数:指的是字符的个数,而不是这些字符在存储中所占的字节数。
例如,varchar (255)意味着可以存储最多 255 个字符。
2. 字符与字节的关系
- VARCHAR字段的实际存储大小会受到字符集(如 UTF-8)影响。UTF-8 编码对于不同字符有不同的字节占用。
- 常见字符(如英文字母、数字)占用 1 字节。
- 一些 Unicode 字符(例如汉字、表情符号等)则需要 3 字节或 4 字节。
- 如果你使用 UTF-8 编码,一个汉字通常占用 3 个字节。因此,varchar (255) 对于汉字来说,可以存储 255 个汉字,而如果是英文字符,可以存储 255 个字符,且每个字符占 1 字节。
3. VARCHAR`存储长度的计算
- 存储长度:MySQL 会使用不同的字节数来存储 VARCHAR 的长度信息,具体如下:
- 如果 N < 256,MySQL 会使用 1 字节来存储该字段的长度。
- 如果 N >= 256,MySQL 会使用 2 字节来存储字段长度。
这是为了节省存储空间。对于较小的 N,1 字节就足够表示长度;而对于较大的 N,2 字节可以表示更大的长度值。
这里会有同学问,为什么 如果 N < 256,MySQL 会使用 1 字节 来存储该字段的长度。 如果 N >= 256,MySQL 会使用 2 字节 来存储字段长度?是规定好的么?
是的,MySQL 对 VARCHAR`类型字段的长度存储采用了这样的设计,是为了在性能与空间优化之间取得平衡。这种机制的设计有以下几个原因:
1.空间效率
存储的长度指的是记录在表中实际数据的长度信息(即字符串的实际长度)。MYSQL需要用某种方式记录每个varchar字段的长度,因为varchar是可变的长度的类型。
如果N<256时,最长只能记录255个字符,那么使用一个字节(8位)来存储长度信息就足够了。1字节可以标识0~255之间的数字。
如果 `N >= 256`,则可能需要表示的长度会大于 255 个字符,这时 MySQL 使用 **2 字节** 来记录长度信息。2 字节可以表示的数字范围是 0 到 65535。
这种机制可以有效节省存储空间。对于大部分使用 varcha