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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计数据库表时,选择正确的字段类型非常重要,因为它会直接影响到数据库的性能和数据的存储。以下是一些常见的字段类型及其应用场景: 1. 整型(Int):适用于存储整数,如用户ID、年龄等。根据需要选择不同的整型类型,如TINYINT、SMALLINT、MEDIUMINT、INT等,它们的区别在于存储范围和存储空间大小不同。 2. 字符串类型(Char、Varchar):适用于存储字符串,如用户名、地址、电话等。Char类型适合存储长度固定的字符串,如密码,而Varchar类型适合存储长度不固定的字符串,如用户名。 3. 浮点型(Float、Double):适用于存储小数,如价格、评分等。Float类型适合存储较小的小数,而Double类型适合存储更大的小数。 4. 日期时间类型(Date、Time、Datetime、Timestamp):适用于存储日期和时间,如注册时间、更新时间等。Date类型只存储日期,Time类型只存储时间,Datetime和Timestamp类型同时存储日期和时间,但存储方式不同,Datetime存储的范围更广,而Timestamp存储的精度更高。 5. 枚举类型(Enum):适用于存储有限的取值范围,如性别、学历等。枚举类型可以限制字段的取值范围,可以提高数据的完整性和一致性。 需要注意的是,选择字段类型应该充分考虑数据的实际情况,如数据的大小、范围、类型等。同时,还需要考虑查询和排序等操作的性能,应该尽量选择较小的字段类型,以减少存储空间和提高查询效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值