0


数据库 varchar 类型应该设计多长?

每每设计表结构的时候都特别纠结,varchar 类型应该设计多长?不知道你是不是跟我一样,也是在这个问题上皱皱巴巴的(囧)

下面我们来看看区别:

说起 MySQL 我们大部分会拿 InnoDB 或 MyISAM 来举栗, 其他数据库中基本也有 VARCHAR 类型并需要提供长度的参数。

其实我们最纠结的是 VARCHAR(?),这个 ?写多长。

我们先来补个基础:
varchar 和 字符集。首先要了解字符集。

① ascii 每个字符占一个字节。
② latin1 也是每个字符一个字节。
③ utf8 每个字符可能用 1, 2 或者 3 个字节表示。
④ utf8mb4 每个字符可能用 1, 2,3 或者 4 个字节表示。
⑤ varchar(255) 声明中的 255 是字符数而不是字节数。

VARCHAR(1) :表示的是这一列最多存 1 个字符而不是 1 个字节。比如可以存 "字", 实际存储时是编码为 utf-8 的。

⑥ char(10) 在给定了字符集之后, 可以存储 10 个字符。 对于 utf8mb4, 它总是占用 40 个字节。永远不要使用

char

,而是使用

varchar。

在 MySQL 中,VARCHAR(1) 和 VARCHAR(255) 在存储方式上是没有区别的, 都是 1 个字节表示字符串长度和字符串经 utf-8 编码后的字节。

MySQL 5.0.3 以前的版本 VARCHAR 的最大长度就是 255, 之后是 65535。 而 VARCHAR(256) 之后表示长度的字节数会变成 2 个。其实在今天来说多一个字节也没什么区别, 但为了兼容性, 通常的数据库设计中还是会出现很多 VARCHAR(255)。

实际上, 把所有较短的字符串列都设为 VARCHAR(255) 并不是最好的做法,还是要合理选取长度。尽管 InnoDB 是动态存储的, 但别的数据库引擎不一定是如此,有的可能会使用固定长度的行,或者固定大小的内存表, 内存表即为 SQL 查询中产生的临时表,它通常会为 varchar 类型分配最大的空间,比如 utf-8 编码下, 内存表可能要为 VARCHAR(255) 分配 2+3×255 字节 (2 是因为存的是字节长度而不是字符长度), 如果行数非常多,这也会带来性能问题。不管其中每一行存储的数据是长还是短。另外也注意到 InnoDB 的单列索引每个结点的最大是 767 字节 (即2+3×255)。

InnoDB 最大的行的大小是半个数据页 database page (大约 8000 字节), 如果可变长的列 (如 varbinary,varchar, text, blob) 超过了这个大小会被存到外面去,行里面只是存一个指针, 这会比存 inline 慢很多。 我们再顺便说一下 text 类型, text 的存储方法和 varchar 也没什么区别, 就是没有长度的限制,因此它在有 join 等产生中间结果的查询中会非常慢。

标签: 数据库 mysql java

本文转载自: https://blog.csdn.net/qingqingxiaocao1989/article/details/128106723
版权归原作者 是茜茜qianqian呀 所有, 如有侵权,请联系我们删除。

“数据库 varchar 类型应该设计多长?”的评论:

还没有评论