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

  • 相关阅读:
    CentOS7.9安装elasticsearch-8.3.1和window 10安装elasticsearch-8.3.1
    讲解用Python处理Excel表格
    数据表插入数据insert into
    宏(预编译)详解
    正则表达式
    python关联规则学习:FP-Growth算法对药品进行“菜篮子”分析
    会议OA项目之我的审批
    Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序
    Selenium入门(一)Java 搭建 Selenium 环境
    解决跨域问题的FastAPI应用及常见报错解析
  • 原文地址:https://blog.csdn.net/qingqingxiaocao1989/article/details/128106723