数据库 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 等产生中间结果的查询中会非常慢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值