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. HDU 1248 寒冰王座 (水题的N种做法!)(含完全背包)

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. python-一个小练习

    myseq = '''[a:1,b:2,c:3] [a:3,b:3,c:8] [a:7,c:2:m:7,r:4] [a:2,c:4:m:6,r:4] [a:3,b:2,c:7,o:5]''' def ...

  3. 关于Widget预览图的改动

    在做项目时候,由于常常不带GPS功能.所以在有些细节上须要做处理,当中之中的一个就是.快捷开关的预览图和实际效果图的差异 在我们快捷开关的预览图中,总是能够看到五个快捷开关,事实上就包含GPS信息 而 ...

  4. java内部类的一些看法

    java内部类, 我在看<thinking in java>的时候总感觉模棱两可的, 挣扎了好几天之后, 感觉有一部分的问题想的清楚了, 写一个随笔记录一下, 以备以后修改和查看 什么是内 ...

  5. 嵌入式开发之davinci--- 8168 question about capture PAL on 8168

    http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/717/t/340483.aspx?pi199607=2

  6. DeepLearningFlappyBird-深度学习玩游戏-1-环境搭建

    -------------------------------------------------------------------------------------- https://githu ...

  7. Aspose 直接插入SQL Server DataTalbe

    原文链接:http://www.cnblogs.com/hellohongfu/p/7362830.html 下面的代码可以根据excel文件,生成创建表的SQL,以及测试InsertSQL .方法将 ...

  8. Delphi服务端和PHP客户端通过Socket通信

    在开始之前看下效果 PHP页面作为客户端发送请求给作为服务端的Delphi应用程序 PHP客户端页面打开如下 Delphi服务端应用程序打开如下 每次PHP页面刷新一下,Delphi的文本框都显示&q ...

  9. WinDbg 查看静态变量

    有如下Class.若想查看静态变量内容.因为静态变量和类绑定,仅需要查看类即可. namespace ConsoleApplication13 { class Program { public sta ...

  10. nyoj 999

    nyoj 999: 点击打开题目链接 题目思路,处理一下地图,把 D E 能看到的地方标记一下.然后就是暴力广搜一下.标记状态,因为同样在同一个点,但是你刚出发到达那点和找到D之后到达相同的点和找到E ...