• MySQL varchar 最大长度,text 类型占用空间剖析


    MySQL 表中行的最大大小为 65,534(实际行存储从第二个字节开始)字节。每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节。

    那么来验证下 varchar 类型的实际最大长度:
    测试环境:MySQL版本 5.7.19

    //首先要设置下 mysql 为严格执行模式,不然 varchar 超出最大长度为自动转为 text 类型
    set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    
    [SQL]
    CREATE TABLE test(
        va VARCHAR(21845)
    )DEFAULT CHARSET=utf8;
    1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
    

    这里看到 21,845 个字符,utf-8 下刚好为 65,535 个字节,但是 varchar 保存时用一个字节或两个字节长的前缀+数据。如果 varchar 列声明的长度大于 255,长度前缀是两个字节,所以 varchar 的最大长度应为:

    65532=65535-1-2(字节)
    utf-8 下为 21844=65532/3(字符)
    

    看示例:

    [SQL]
    CREATE TABLE test(
        va VARCHAR(21844)
    )DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected
    

    那么看下 text 类型在实际行中占用的字节数:

    [SQL]
    CREATE TABLE test1(
        va VARCHAR(21841),
        tx text
    )DEFAULT CHARSET=utf8;
    1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
    

    可以看出错误提示,行长已经超过最大长度。在上文看到,

    每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节。

    但是 va 字段已经给 tx 字段腾出了 9 字节的空间了啊,为什么还是不行呢。
    从官方文档看到

    BLOB 和 TEXT 类型需要 1、2、3 或者 4 个字节来记录列值的长度,取决于该类型的最大可能的长度。

    那么就是至少需要 10 字节(9+1)的空间了,再试一下:

    [SQL]
    CREATE TABLE test1(
        va VARCHAR(21840),
        tx text
    )DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected
    

    这里看到,当 va 字段腾出 12 字节的空间时,表可以创建成功。

    varchar 最长是 64k,但是注意 这里的 64k 是整个 row 的长度,要考虑到其它的 column,还有如果存在 not null 的时候也会占用一位,对不同的字符集,有效长度还不一样,比如 utf8,最多 21,845,还要除去别的 column,但是 varchar 在一般情况下存储都够用了。

    如果遇到了大文本,考虑使用 text,最大能到 4G。效率来说基本是 char>varchar>text,但是如果使用的是 Innodb 引擎的话,推荐使用 varchar 代替 char。char 和 varchar 可以有默认值,text 不能指定默认值。

  • 相关阅读:
    N 种仅仅使用 HTML/CSS 实现各类进度条的方式
    使用 CSS 轻松实现一些高频出现的奇形怪状按钮
    通过jdb命令连接远程调试的方法
    (转)Python中asyncio与aiohttp入门教程
    (转)从0到1,Python异步编程的演进之路
    (转)python︱用asyncio、aiohttp实现异步及相关案例
    (转)Python 如何仅用5000 行代码,实现强大的 logging 模块?
    (转)python的dict()字典数据类型的方法详解以及案例使用
    (转)Python Async/Await入门指南
    (转)Python运维自动化psutil 模块详解(超级详细)
  • 原文地址:https://www.cnblogs.com/Cecil_1995/p/10974415.html
Copyright © 2020-2023  润新知