mysql对表列数和行大小的限制

2023-11-07

列计数限制

MySQL对于每个表具有4096个列的硬限制,但给定表的有效最大值可能较少。精确的列限制取决于几个因素:

  1. 表的最大行大小限制列的数量(可能是大小),因为所有列的总长度不能超过此大小。请参阅行大小限制

  2. 单个列的存储要求限制了适合给定最大行大小的列数。某些数据类型的存储要求取决于存储引擎,存储格式和字符集等因素。请参见数据类型存储要求

  3. 存储引擎可能会施加限制表列计数的额外限制。例如, InnoDB每个表的限制为1017列。请参见对InnoDB表的限制有关其他存储引擎的信息,请参见替代存储引擎

  4. 每个表都有一个.frm包含表定义的文件。该定义以可能影响表中允许的列数的方式影响此文件的内容。请参见.frm文件结构引起的限制

行大小限制

给定表格的最大行大小由以下几个因素决定:

  1. MySQL表的内部表示形式的最大行大小限制为65,535字节,即使存储引擎能够支持较大的行。 BLOB并且 TEXT列只向行大小限制贡献9到12个字节,因为它们的内容与行的其余部分分开存储。

  2. InnoDB 适用于数据库页面本地存储的数据 的表的最大行大小略小于4KB,8KB,16KB和32KB innodb_page_size 设置的一半页面 。例如,对于默认的16KB InnoDB页面大小,最大行大小略小于8KB 。对于64KB页面,最大行大小略小于16KB。请参见 对InnoDB表的限制

  3. 如果包含可变长度列的InnoDB 行超过最大行大小,请InnoDB为外部页外存储选择可变长度列,直到该行适合InnoDB 行大小限制。存储在页外的可变长度列的本地存储的数据量按行格式而不同。有关更多信息,请参见 InnoDB行存储和行格式

  4. 不同的存储格式使用不同数量的页眉和预告片数据,这会影响可用于行的存储量。

行大小限制示例

以下InnoDB 和MyISAM示例中演示了MySQL最大行大小限制为65,535字节。无论存储引擎如何,即使存储引擎可能能够支持较大的行,限制也被强制执行。

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1;
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g VARCHAR(6000)) ENGINE=MyISAM CHARACTER SET latin1;
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在下面的MyISAM例子中,改变柱TEXT 避免了65535字节的行大小限制,并且允许成功,因为操作 BLOB和 TEXT列仅有助于朝向行大小9至12个字节。

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g TEXT(6000)) ENGINE=MyISAM CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)
  • 1
  • 2
  • 3
  • 4

操作成功执行InnoDB 表,因为更改列以 TEXT避免MySQL 65,535字节行大小限制,并且InnoDB 可变长度列的页外存储避免了 InnoDB行大小限制。

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g TEXT(6000)) ENGINE=InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)
  • 1
  • 2
  • 3
  • 4

可变长度列的存储包括长度字节,它们被计入行大小。例如, VARCHAR(255) CHARACTER SET utf8mb3列需要两个字节来存储值的长度,因此每个值最多可以占用767个字节。

t1 由于列需要32,765 + 2个字节和32,766 + 2个字节,因此 创建表的语句成功,最大行大小为65,535字节:

mysql> CREATE TABLE t1
       (c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)
  • 1
  • 2
  • 3
  • 4

创建表的语句t2失败,因为尽管列长度在65,535字节的最大长度内,需要两个附加字节来记录长度,这导致行大小超过65,535字节:

mysql> CREATE TABLE t2
       (c1 VARCHAR(65535) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

将列长度减少到65,533或更少可允许语句成功。

mysql> CREATE TABLE t2
       (c1 VARCHAR(65533) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.01 sec)
  • 1
  • 2
  • 3
  • 4

对于MyISAM表, NULL列需要行中的额外空间才能记录其值 NULL。每NULL 列需要一位额外的值,向上舍入到最接近的字节。

创建表的语句t3失败,因为除了可变长度列长度字节所需的空间之外,还MyISAM需要NULL列的空间,导致行大小超过65,535字节:

mysql> CREATE TABLE t3
       (c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL)
       ENGINE = MyISAM CHARACTER SET latin1;
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

有关列存储的信息,请参见InnoDB表的物理行结构

InnoDB将行大小(对于数据库页面中本地存储的数据)限制为略小于4KB,8KB,16KB和32KB innodb_page_size 设置的数据库页面的一半,对于64KB页面,将行大小限制 为略小于16KB。
t4由于定义的列超过16KB InnoDB页面的行大小限制,因此 创建表的语句失败。

mysql> CREATE TABLE t4 (
       c1 CHAR(255),c2 CHAR(255),c3 CHAR(255),
       c4 CHAR(255),c5 CHAR(255),c6 CHAR(255),
       c7 CHAR(255),c8 CHAR(255),c9 CHAR(255),
       c10 CHAR(255),c11 CHAR(255),c12 CHAR(255),
       c13 CHAR(255),c14 CHAR(255),c15 CHAR(255),
       c16 CHAR(255),c17 CHAR(255),c18 CHAR(255),
       c19 CHAR(255),c20 CHAR(255),c21 CHAR(255),
       c22 CHAR(255),c23 CHAR(255),c24 CHAR(255),
       c25 CHAR(255),c26 CHAR(255),c27 CHAR(255),
       c28 CHAR(255),c29 CHAR(255),c30 CHAR(255),
       c31 CHAR(255),c32 CHAR(255),c33 CHAR(255)
       ) ENGINE=InnoDB ROW_FORMAT=COMPACT DEFAULT CHARSET latin1;
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using 
ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 
bytes is stored inline.

 

 

 

 

 

https://blog.csdn.net/Dr_Joseph/article/details/78111312

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql对表列数和行大小的限制 的相关文章

  • 使用 Hibernate 在 MySQL 中存储字节数组

    我正在尝试保存带有字节数组字段的实体 我在 MySQL 数据库之上使用 Hibernate 和 JPA 这是字段定义 对于嵌入式 H2 数据库来说效果很好 Entity name blob public class Blob Lob Bas
  • HTAccess - 令人困惑的干净网址

    如果我想简单地重定向 clients page to clients php view page我会使用像这样简单的东西 它效果很好 Options FollowSymlinks RewriteEngine on RewriteRule c
  • 如果列有多个逗号分隔值,如何过滤 mysql 数据?

    我想问如果检查条件以查找具有多个逗号分隔值的列 如何过滤 mysql 数据 我给你举个例子 我有下表说 tbitems id item names item types item features 1 item 1 8 6 10 5 4 9
  • 使用mysql在一个查询中选择多个表中的子项总数

    我整个下午都在尝试处理一个查询 或两个或三个 以获得三个表的所有子表的计数 看看我的设计 用户表 id user name 1 foo 2 bar 赢表 id won user 1 1 2 1 3 2 绘制表格 id draw user 1
  • MySQL+子串怎么做? + 替换?

    我不太擅长 SQL 希望能够变得更好 我在尝试执行某些表操作时遇到一些麻烦 我希望能够从下面的 ProgUID 列中选择子字符串 就像是 SUBSTRING table ProgUID 3 12 这将为我提供 ProgUID P CAMVE
  • MySQL 服务器未启动

    当我做 mysql u root p并输入my password这就是我得到的 错误 2002 HY000 无法通过套接字 var run mysqld mysqld sock 连接到本地 MySQL 服务器 2 所以我输入 systemc
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 单行的总和值?

    我有一个 MySQL 查询 它返回由一系列 1 和 0 组成的单行 它用于进度条指示器 我现在在代码中对它进行求和 但我尝试对查询中的值求和 并意识到我无法使用 SUM 因为它们有很多列 但只有一行 有没有办法可以在查询中自动求和 就像这样
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • Python:如何使用生成器来避免 sql 内存问题

    我有以下方法来访问 mysql 数据库 并且查询在服务器中执行 我无权更改有关增加内存的任何内容 我对生成器很陌生 并开始阅读更多有关它的内容 并认为我可以将其转换为使用生成器 def getUNames self globalUserQu
  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • MySQL Connector/C++ 库链接错误问题

    PROBLEM 好吧 我一直在尝试遵循 MySQL Forge Wiki 和其他一些网站上的示例代码 这些网站提供了有关如何获得简单数据库连接的教程 但由于某种原因 我的项目总是因链接错误而失败 我可以我自己不明白为什么或如何解决它 我仍在
  • 如何在Mysql中仅将不同的值从一个表复制到另一个表?

    我有一个大约 2 5GB 的 MySql 数据库 表 A 具有以下列 anoid query date item rank url 我刚刚创建了另一个仅包含列的表 b query and date 我想在查询列中插入所有不同的记录 及其各自
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • Mysql 创建定义器

    我创建了一个在 CentOS Web 服务器上运行的 Intranet Web 应用程序 该应用程序使用另一个本地服务器 始终是 CentOS 作为 MySQL 数据库 在数据库内部我创建了例程 这些例程总是这样开始 CREATE DEFI

随机推荐

  • STA系列 - 特殊时序分析multicycle/half-cycle/false path

    文章目录 什么是require time arrive time Multicycle Path Half Path Falth Path 本篇文章介绍的是特殊的时序path 全文为视频笔记 以及自己的理解 https www bilibi
  • python ,pip,pymmssql的安装

    1 下载python和pip安装包 下载 python 2 7 https www python org downloads windows 下载 pip https pypi python org pypi pip downloads下载
  • ruoyi-vue-plus学习2(异步日志)(@EventListener)(@Async)(线程池)(监听器)

    ruoyi vue plus的日志打印是通过监听器实现的 和原版若依稍稍不同 找到登录时记录日志的方法 该方法如下 这里的参数LogininforEvent为消息类 注意 貌似高版本的spring定义消息类不需要继承ApplicationE
  • React请求机制优化思路

    说起数据加载的机制 有一个绕不开的话题就是前端性能 很多电商门户的首页其实都会做一些垂直的定制优化 比如让请求在页面最早加载 或者在前一个页面就进行预加载等等 随着react18的发布 请求机制这一块也是被不断谈起 并且在后续其实也给出了明
  • 线性回归(最小二乘法)

    线性回归 算法概述 一个例子 数据 工资和年龄 2个特征 目标 预测银行会贷款给我多少钱 标签 考虑 工资和年龄都会影响最终银行贷款的结果那么它们各自有多大的影响呢 参数 工资 年龄 额度 4000 25 20000 4000 25 200
  • 关于特殊时期电力行业信息中心运营思路

    一 防御思路 安全运营是一系列规则 技术和应用的集合 用以保障组织核心业务平稳运行的相关活动 是通过灵活 动态的实施控制以期达到组织和业务需要的整体范围可持续性正常运行 信息中心在特殊时期扮演着关键的角色 因此需要精心设计运营思路以确保信息
  • 单片机全局变量 局部变量

    若在C51中定义一个全局变量 编译器将在RAM中为该变量指定一个专用地址 在C程序中给变量赋的值将存入这个专用地址中 程序操作该变量是 首先从专用地址中取出存放的值 然后再进行计算 全局变量被定义在内存中的专门地址上 存储位置固定 C51中
  • 实例:vmem_disk驱动-->vmem_disk的硬件原理(1)

    vmem disk是一种模拟磁盘 其数据实际存储在RAM中 它使用通过vmalloc 分配出来的内存空间来模拟出一个磁盘 以块设备的方式来访问这篇内存 加载vmem disk ko后 在使用默认模块参数的情况下 系统会增加4个块设备节点 其
  • 线性回归和逻辑回归

    1 回归和分类的问题 比如我们想预测房价 预测天气 预测股票等这些数值都是一些连续型的数值 如果我们想知道我一些房间中有多少个卧室 那么这些肯定是一个整数比如说2个卧室 3个卧室 不可能是2 1个卧室 3 68个卧室 类似于小数的这样一个连
  • 使用c语言写一个会动的小人

    使用c语言写一个会动的小人 运行效果 代码以及注释 运行效果 代码以及注释 include
  • 接口测试-第02天-接口用例设计思路、单接口用例,业务场景用例、postman

    更多功能测试以及全套学习路线图均在专栏 戳进去领取 系列文章目录 软件测试功能到自动化学习路线图 2022年最新版技术栈 软件测试01 从了解测试岗位职能和测试流程开始 附作业 软件测试02 6大实际案例手把手教你设计测试点 软件测试03
  • Linux Apache服务详解——Apache服务基础知识

    今天我们继续给大家介绍Linux相关内容 本文主要内容是Apache服务基础知识 一 Apache服务简介 Apache是一种网站服务程序 所谓网站服务程序 就是作为服务端 处理其他用户客户端发起的http或者https的请求 并给予响应的
  • 遇到问题: Windows下安装Python扩展模块, 提示“Unable to find vcvarsall.bat”的问题

    全程参考 https www cnblogs com yyds p 7065637 html 写得很好 不知道能不能解决我的问题 尝试解决办法 安装visual studio 2015 原因请看下面 1 为什么遇到这个问题 1 在安装商汤出
  • stem什么意思matlab,matlab中stem函数用法_常见问题解析,matlab

    matlab中如何自定义图例 常见问题解析 matlab中自定义图例的方法 首先打开matlab软件 然后点击勾选按钮 新建一个文件并输入代码为 x 0 pi 50 2 pi 接着执行该文件并添加一行新的代码为 legend a b 即可
  • JavaScript 基础工具清单

    转载至 https linux cn article 5935 rss html 在训练营中 为扩展学员们的编程能力 我们给他们介绍了一些工具和库 目前有位JavaScript学员Kalina 他汇总了这些工具的清单 以分享给其他的代码爱好
  • 中移链合约常用开发介绍(五)合约项目编译

    01 目的 本文档介绍了工程化开发智能合约项目的工程树目录 介绍了各个文件夹及文件的含义和用途 本文档将沿用之前文章中实现的地址簿合约内容 以初始化项目为例展开介绍 适合刚接触合约开发的开发人员用来了解智能合约项目 帮助其快速了解以及上手智
  • NULL 与 nullptr

    在过去 我们如果要表示一个指针为空 我们条件反射肯定会这么写 int p NULL 然而啊 有没有想过这是有问题的 比如下面的这段代码 include
  • 2023华为OD机试真题【最长公共后缀】

    前言 python参考点我 题目内容 编写一个函数来查找 字符串数组 中的最长公共后缀如果不存在公共后缀 返回固定字符串 Zero 补充说明 1 字符串长度范围 2 1000 2 字符串中字符长度范围为 1 126 输入描述 abc bbc
  • vue3表格按需导出excel

    效果图展示 不要英文字段 excel内容展示 隐藏英文字段 首先安装xlsx依赖 npm install xlsx save export default imported as XLSX was not found in xlsx 当出现
  • mysql对表列数和行大小的限制

    列计数限制 MySQL对于每个表具有4096个列的硬限制 但给定表的有效最大值可能较少 精确的列限制取决于几个因素 表的最大行大小限制列的数量 可能是大小 因为所有列的总长度不能超过此大小 请参阅行大小限制 单个列的存储要求限制了适合给定最