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 不能指定默认值。

MySQL varchar 最大长度,text 类型占用空间剖析的更多相关文章

  1. 着重基础之—MySql Blob类型和Text类型

    着重基础之—MySql Blob类型和Text类型 在经历了几个Java项目后,遇到了一些问题,在解决问题中体会到基础需要不断的回顾与巩固. 最近做的项目中,提供给接口调用方数据同步接口,传输的数据格 ...

  2. Mysql varchar大小长度问题介绍

    如果被 varchar 超过上述的 b 规则,被强转成 text 类型,则每个字段占用定义长度为 11 字节,当然这已经不是 varchar 了4.0版本以下,varchar(20),指的是20字节, ...

  3. 【Mysql】Mysql Json类型或Text类型可以建索引吗?

    一.JSON类型 答案是不可以 为Json类型建索引会报错 mysql)); ERROR (): JSON column 'card_pay_data' cannot be used in key s ...

  4. mybatis 处理 mysql 表中的 text类型的 字段

    在mysql 中 text类型的字段: service_detail text NULL 服务描述   . 对应java文件中 model 中的 String:  private String ser ...

  5. Mysql VARCHAR(X) vs TEXT

    一般情况下,我们不太会纠结用Varchar或text数据类型. 比如说,我们要存储邮箱,我们自然会用varchar,不会想到用text.而当我们要存储一段话的时候,选了text,感觉varchar也够 ...

  6. 操作MySQL出错提示“BLOB/TEXT column request_data in key specification without a key length”解决办法

    错误原因: 查阅资料后才知道,原来Mysql数据库对于BLOB/TEXT这样类型的数据结构只能索引前N个字符.所以这样的数据类型不能作为主键,也不能是UNIQUE的.所以要换成VARCHAR,但是VA ...

  7. 常用mysql text 类型,varchar最大长度

    MySQL 3种text类型的最大长度如下: TEXT 65,535 bytes ~64kb MEDIUMTEXT 16,777,215 bytes ~16Mb LONGTEXT 4,294,967, ...

  8. 【MySQL】使用Length和Cast函数计算TEXT类型字段的长度

    背景: 前段时间,业务需要,为了快速让解析的Excel入库,所以把不是很确定的字段全部设置成了TEXT. 今天需要进行表结构优化,把字段长度控制在合适的范围,并尽量不使用TEXT类型. -- 计算长度 ...

  9. 关于mysql varchar 类型的最大长度限制

    Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This ...

随机推荐

  1. java zip压缩文件和文件夹

    public class FileUtil { /** * 压缩文件-File * @param out zip流 * @param srcFiles 要压缩的文件 * @param path 相对路 ...

  2. Handlebars的基本用法 Handlebars.js使用介绍 http://handlebarsjs.com/ Handlebars.js 模板引擎 javascript/jquery模板引擎——Handlebars初体验 handlebars.js 入门(1) 作为一名前端的你,必须掌握的模板引擎:Handlebars 前端数据模板handlebars与jquery整

    Handlebars的基本用法 使用Handlebars,你可以轻松创建语义化模板,Mustache模板和Handlebars是兼容的,所以你可以将Mustache导入Handlebars以使用 Ha ...

  3. NYOJ 1067 Compress String(区间dp)

    Compress String 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描写叙述 One day,a beautiful girl ask LYH to help he ...

  4. Tomcat 80端口 配置及域名访问步骤

    一.修改端口tomcat默认监听端口是8080,我们如果想不带端口的直接访问项目,就必须监听80 端口: service.xml 以下代码段 <Connector port="8080 ...

  5. hdoj 4932 Miaomiao&#39;s Geometry 【暴力枚举】

    题意:在一条直线上有n个点.取一长度差为x的区间. 规定点必须是区间的端点. 让你找出来最大的x 策略:rt 分析可得:两个相邻点之间的区间要么是两个点的差,要么就是两个点的差的一半,那我们就简单枚举 ...

  6. jmeter3.0_bodydata中存在中文乱码

    jmeter3.0_bodydata中存在中文乱码 1.进入jmeter.properties配置文件 找到#jsyntaxtextarea.font.family=Hack ,并将“#”取消并重启j ...

  7. Shell hook

    [目的]实现 ll -as   +hook+     clear Shell脚本及钩子 - CSDN博客 https://blog.csdn.net/shengzhu1/article/details ...

  8. spring的依赖注入(DI)、控制反转(IOC)和面向切面(AOP)

    在spring的配置文件增加 <context:component-scan base-package="com.jmu.ccjoin.service"/> <c ...

  9. kbmMW实现sql查询(图文并茂)

    kbmMW对于Delphi来说,是最好的多层框架,没有之一,无论是效率.稳定及架构都让人无可挑剔,尤其自Delphi支持跨平台开发以来,随着Delphi支持ios及Android移动开发,KbmMW也 ...

  10. Vue源码探究-源码文件组织

    Vue源码探究-源码文件组织 源码探究基于最新开发分支,当前发布版本为v2.5.17-beta.0 Vue 2.0版本的大整改不仅在于使用功能上的优化和调整,整个代码库也发生了天翻地覆的重组.可见随着 ...