首页 > 数据库 >MySQL varchar 单字段的最大字符长度是多少

MySQL varchar 单字段的最大字符长度是多少

时间:2024-05-22 09:58:38浏览次数:27  
标签:varchar DEFAULT 单字 MySQL 列表 mysql 65535 NULL

MySQL varchar 字段的最大字符长度是多少

MySQL 行记录的存储结构:

变长字段长度列表 NULL值列表 记录头信息 row_id trx_id roll_ptr 列1 列2 列n
每个变长字段值的长度
(倒序),根据变长字段的长度而定
每个允许为NULL字段的标志位
(倒序),每个NULL字段占1位
(5字节) 隐藏字段(6字节) 隐藏字段(6字节) 隐藏字段(7字节)
记录的额外信息 记录的真实数据

MySQL一行记录除了 TEXT,BLOB 类型的列,其余的字段长度加起来不能超过 65535 字节;

mysql> CREATE TABLE test (`name` VARCHAR(65535)  NULL) ENGINE = InnoDB DEFAULT CHARACTER SET = ascii ROW_FORMAT = COMPACT;
ERROR 1118 (42000): 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
mysql>

varchar 指定的是字符数, ascii​ 编码下,一个字符占用一个字节;

65535 字段包含:「变长字段长度列表」、「NULL 值列表」、真实数据长度;

「变长字段长度列表」:每个 varchar 字段占用的字节数,这里只有一个字段,假设最大长度 65535 对应十六进制 0xFFFF,占用 2 字节的空间;

「NULL 值列表」:只有一个字段,占用 1 字节;

65535 - 「NULL 值列表」长度 - 「变长字段长度列表」长度 = 65535 - 1 - 2 = 65532

所以在字符集是 ascii ,字段允许为空的情况下,单字段的 varchar 的最大值是 65532:

mysql> CREATE TABLE test (`name` VARCHAR(65533)  NULL) ENGINE = InnoDB DEFAULT CHARACTER SET = ascii ROW_FORMAT = COMPAC
T;
ERROR 1118 (42000): 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
mysql>


mysql> CREATE TABLE test (`name` VARCHAR(65532)  NULL) ENGINE = InnoDB DEFAULT CHARACTER SET = ascii ROW_FORMAT = COMPAC
T;
Query OK, 0 rows affected (0.02 sec)

mysql>

在字符集是 ascii ,字段不允许为空的情况下,单字段的 varchar 的最大值是 65533:

mysql> CREATE TABLE test (`name` VARCHAR(65534) NOT NULL DEFAULT '') ENGINE = InnoDB DEFAULT CHARACTER SET = ascii ROW_F
ORMAT = COMPACT;
ERROR 1118 (42000): 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
mysql>


mysql> CREATE TABLE test (`name` VARCHAR(65533) NOT NULL DEFAULT '') ENGINE = InnoDB DEFAULT CHARACTER SET = ascii ROW_F
ORMAT = COMPACT;
Query OK, 0 rows affected (0.00 sec)

mysql>

如果字符集是 utf8mb4,字符允许为空,65535 / 4 = 16383 = 0x3FFF,「变长字段长度列表」也是占用两字节

所以 varchar 字段的最大字符长度是:(65535 - 1 - 2) / 4 = 65532 / 4 = 16383

mysql> CREATE TABLE test (`name` VARCHAR(16384)  NULL) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 ROW_FORMAT = COMP
ACT;
ERROR 1074 (42000): Column length too big for column 'name' (max = 16383); use BLOB or TEXT instead
mysql>


mysql> CREATE TABLE test (`name` VARCHAR(16383)  NULL) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 ROW_FORMAT = COMP
ACT;
Query OK, 0 rows affected (0.00 sec)

mysql>

字符不允许为空时,(65535 - 2) / 4 = 65533 / 4 = 16383 ,最大也是 16383 字符。

多字段的情况下:每个字段的长度 + 「变长字段长度列表」 + 「NULL 值列表」 <= 65535

参考文章:

MySQL 一行记录是怎么存储的?

标签:varchar,DEFAULT,单字,MySQL,列表,mysql,65535,NULL
From: https://www.cnblogs.com/zhpj/p/18205546/what-is-the-maximum-character-length-of-mysql-varc

相关文章

  • MySQL varchar 单字段的最大字符长度是多少
    MySQLvarchar单字段的最大字符长度是多少‍MySQL一行记录除了TEXT,BLOB类型的列,其余的字段长度加起来不能超过65535字节;mysql>CREATETABLEtest(`name`VARCHAR(65535)NULL)ENGINE=InnoDBDEFAULTCHARACTERSET=asciiROW_FORMAT=COMPACT;ERROR1118(42000......
  • MYSQL使用SELECT语句进行DELETE操作
    使用SELECT语句进行DELETE操作语法如下:DELETEFROM[表名]WHERE[筛选条件]有时我们可以需要通过使用SELECT语句来确定要删除的记录,然后再将找到的记录删除假设有一个名为s_user的表,用于存储用户信息。现在,我们希望删除所有已经失活的用户。DELETEFROMs_userWHERE......
  • 【转】mysql之高性能索引
    https://www.cnblogs.com/manmanrenshenglu/p/9013073.html当db的量达到一定数量级之后,每次进行全表扫描效率就会很低,因此一个常见的方案是建立一些必要的索引作为优化手段,那么问题就来了:那么什么是索引呢?索引的实现原理是怎样的?我们通常说的聚集索引,非聚集索引的区别是什么?......
  • MySQL delete 表数据,磁盘空间不释放 ?
    最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多。为了节约成本,定期进行数据备份,并通过delete删除表记录。明明已经执行了delete,可表文件的大小却没减小,令人费解项目中使用MySQL作为数据库,对于表来说,一般为表结构和表数据。......
  • MySQL 分库分表之后,id 主键如何处理?
    问:分库分表之后,id主键如何处理? 其实这是分库分表之后你必然要面对的一个问题,就是id咋生成?因为要是分成多个表之后,每个表都是从1开始累加,那肯定不对啊,需要一个全局唯一的id来支持。所以这都是你实际生产环境中必须考虑的问题。 基于数据库的实现方案 数据库自增id......
  • Pymysql的使用
    一、使用MySQLworkbench建立数据库、表创建spider数据库dropdatabasespider;createdatabasespider;ALTERDATABASEspiderCHARACTERSETutf8mb4COLLATEutf8mb4_general_ci;创建users表 usespider;droptableifexistsusers;createtableusers(idint(1......
  • 简单叙述MySQL如何优化?
    数据库设计优化:尽量减小占用磁盘空间:使用较小的数据类型,如mediumint替代int。定义字段为notnull,除非需要允许空值。对于不变的字段,如固定长度的字符串,采用char而不是varchar。优化索引设计:主索引应尽可能短,以提高效率。仅创建必要的索引,避免不必要的索引占用资源。......
  • MySql报错:Lock wait timeout exceeded: try restadina transaction
      这次是在Navicat上复制了一个表结构和数据准备备份一下,然后要用语句批量处理数据,结果导致项目上的更新操作报这个错误。  原因是因为表中的数据量太大,复制表一时半会卡到那了。  于是我在网上搜索了如下办法。尝试在数据库中杀死线程来终止复制表的操作。SELECT*FR......
  • MySQL设置表自增步长
    在MySQL中,我们可以使用AUTO_INCREMENT属性为表的某一列设置自增功能。但是,MySQL本身并不直接支持设置自增步长(incrementstep)的功能,即我们不能直接指定每次自增的数值增加多少。不过,我们可以通过一些间接的方法来模拟这个功能。一、表设置自增字段但首先,让我们看一下如何为一个......
  • mysql报错:(1040, ‘ny connections‘)
    在项目、可视化数据库管理工具(比如:Navicat)连接Mysql数据库时出现:toomanyconnections的错误,偶现情况。原因是Mysql设置的最大连接数太小,连接池已满,实际连接数超过了mysql允许的最大连接数,访问量过高,MySQL服务器抗不住。解决:1、(推荐)修改max_connections,如果这个值已经很大,2、......