https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000210013
适用版本:V2.1.x、V2.2.x、V3.1.x、V3.2.x内容类型:TechNote

租户变量 max_allowed_packet 用于设置最大网络包大小,单位是 Byte。

属性 描述
参数类型 int
默认值 4194304
取值范围 [1024,1073741824]
生效范围
  • Global
  • Session
是否参与序列化
是否可修改 该变量可通过 SET GLOBAL 语句修改 Global 生效方式下的取值,不可通过 SET SESSION 语句修改 Session 生效方式下的取值。Session 值仅支持查看,且 Session 值只能与 Global 值相同。使用时,客户端与 Server 端一般均需要调整。

变量 max_allowed_packet 用于设置客户端与服务端(OBSERVER)传送网络包时允许的最大网络包大小。以 JDBC 为例,当应用使用 JDBC 与 OceanBase 租户建立连接后,JDBC 会向 OceanBase 主动查询该变量的值,从而控制可传输数据的最大长度。 ​ 例如,当 max_allowed_packet = 1024、应用端使用 OBClient 连接 OceanBase、使用 PrepareStatement 执行 SQL 时,由于 MySQL 协议规定在传输 PrepareStatement SQL 类型的报文时,需要向该 SQL 中添加  字符,用于标识该 SQL 为 PrepareStatement 类型,因此该 SQL 可允许的最大长度为 max_allowed_packet - 1 = 1023,若超过该长度,则会直接由 JDBC 抛出错误。

query size(1024) >= max_allowed_packet(1024)。

需要注意以下:

  • 租户变量 max_allowed_packet 设置不合理将会导致各种隐形的问题。
  • 设置最大网络包大小的变量 max_allowed_packet 使用默认值 4194304 字节时, 若想使用 REPEAT()RPAD() 等函数生成长度超过该变量值的目标字符串时,MySQL 模式下会返回 null,Oracle 模式下会返回 VARCHAR 类型的最大长度 32767,与这个参数关系不大。
  • 对于 MySQL 模式来讲,若向 LONGTEXT 类型的列中插入超长的字符串时,在某些情况下会发生错误并禁止插入。

相关案例

length 函数与 max_allowed_packet

在使用字符串函数时(如 REPEAT()RPAD() 等),若预计其生成的目标字符串长度 > max_allowed_packet 值,如果是 MySQL 模式则相关函数返回结果为 null;如果是 Oracle 模式,则与 max_allowed_packet 没有直接关系。

例如在 MySQL 模式下如下示例:当 max_allowed_packet = 2^22(默认值)时,执行以下 SQL 会返回 null:select length(repeat('z', pow(2, 23))) from dual

<mysql:5.6.25:test>select length(repeat('z',pow(2,23))) from dual;
+-------------------------------+
| length(repeat('z',pow(2,23))) |
+-------------------------------+
| NULL |
+-------------------------------+
1 row in set, 1 warning (0.001 sec) <mysql:5.6.25:test>show warnings;
+---------+------+-----------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------------------------------------+
| Warning | 1301 | Result of repeat() was larger than max_allowed_packet (4194304) - truncated |
+---------+------+-----------------------------------------------------------------------------+
1 row in set (0.003 sec) <mysql:5.6.25:test>select @@max_allowed_packet;
+----------------------+
| @@max_allowed_packet |
+----------------------+
| 4194304 |
+----------------------+
1 row in set (0.001 sec)

因此,若想使用字符串函数生成很长的字符串时,需要保证 max_allowed_packet 的值 >= 该目标字符串的长度。如下示例:设置max_allowed_packet值为pow(2,24),SQL 正常执行。

<mysql:5.6.25:test>select @@max_allowed_packet;
+----------------------+
| @@max_allowed_packet |
+----------------------+
| 16777216 |
+----------------------+
1 row in set (0.001 sec) <mysql:5.6.25:test>select length(repeat('z',pow(2,23))) from dual;
+-------------------------------+
| length(repeat('z',pow(2,23))) |
+-------------------------------+
| 8388608 |
+-------------------------------+
1 row in set (0.127 sec)

LONGTEXT 字段与 max_allowed_packet

LONGTEXT 作为 OceanBase 数据库 MySQL 模式支持的大对象数据类型,其定义的最大有效长度为 50331648 或 48M 个字符,其可插入的最大有效长度同时也间接地受 max_allowed_packet 的约束。 ​ 在使用 SQL 向 LONGTEXT 类型列中插入目标字符串时,该 SQL 长度首先也需满足 max_allowed_packet 的约束,只有满足该约束的情况下,该 SQL 才能顺利传输至 OceanBase 数据库,之后再检查该 SQL 是否满足“插入 LONGTEXT 类型列的目标字符串长度 < 50331648 ”的约束。
​ 例如,在默认启用严格 SQL 模式的 OceanBase 数据库 MySQL 模式中,插入 LONGTEXT 列的目标字符串由应用直接生成,其长度为 length,携带该目标字符串的 INSERT SQL 使用 OBClient 驱动、PrepareStatement 方式执行,该 SQL 的长度为 L。

  • 若 L + 1 < max_allowed_packet:此时该 SQL 长度首先满足了 max_allowed_packet 的约束。

    • 当 length < 50331648 时,满足了“插入 LONGTEXT 类型列的目标字符串长度 < 50331648 ”的约束,成功插入。
    • 当 length >= 50331648 时,不满足“插入 LONGTEXT 类型列的目标字符串长度 < 50331648 ”的约束,故而报错 Data too long for column ...
  • 若 L + 1 >= max_allowed_packet:此时 SQL 长度首先不满足 max_allowed_packet 的约束,直接抛出错误 query size >= max_allowed_packet,插入失败。

如下示例:

<mysql:5.6.25:test>select @@max_allowed_packet;
+----------------------+
| @@max_allowed_packet |
+----------------------+
| 50331648 |
+----------------------+
1 row in set (0.001 sec) <mysql:5.6.25:test>insert into t1 values (1,repeat('z',50331647));
Query OK, 1 row affected (2.157 sec) <mysql:5.6.25:test>select length(r1) from t1;
+------------+
| length(r1) |
+------------+
| 50331647 |
+------------+
1 row in set (0.064 sec) <mysql:5.6.25:test>insert into t1 values (2,repeat('z',50331649));
Query OK, 1 row affected, 1 warning (0.006 sec) <mysql:5.6.25:test>show warnings;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1301 | Result of repeat() was larger than max_allowed_packet (50331648) - truncated |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.034 sec) <mysql:5.6.25:test>select length(r1) from t1;
+------------+
| length(r1) |
+------------+
| 50331647 |
| NULL |
+------------+
2 rows in set (0.002 sec)

适用版本

OceanBase 数据库 V2.x 和 V3.x 版本。

[转帖]max_allowed_packet 与 SQL 长度的关系的更多相关文章

  1. mysql sql长度限制解决

    mysql sql长度限制解决   今天发现了一个错误:   Could not execute JDBC batch update   最后发现原因是SQL语句长度大于1M,而我机器上的mysql是 ...

  2. [转帖]EXPDP dumpfile和parallel的关系

    http://blog.itpub.net/28602568/viewspace-2133375/ 转帖 EXPDP 里面 parallel 与 dumpfile 里面的文件数的关系. 但是我这里有一 ...

  3. (转帖)oracle sql 语句优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. [转帖]oracle改版sql server问题点汇总

    https://www.cnblogs.com/zhangdk/p/oracle_sqlserver.html 只记得 最开始的时候看过 没有具体的了解里面的特点 原作者总结的很好 留下来 以后说不定 ...

  5. java.util.Date与java.sql.Date的关系和转换方法(转)

    在ResultSet中我们经常使用的setDate或getDate的数据类型是java.sql.Date,而在平时java程序中我们一般习惯使用 java.util.Date. 因此在DAO层我们经常 ...

  6. 【转帖】关于sql server 2008 的mdf收缩问题

    原帖地址:http://social.msdn.microsoft.com/forums/windowsazure/pt-br/388f92e1-9a1e-497d-bde1-6664561fd44e ...

  7. Hibernate 三种状态变化 与 sql 语句的关系

    前言:在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来发现它是重要的.对于理解hibernate,JVM和sql的关系有更好的 ...

  8. (一)DB、DBMS、SQL之间的关系

    一.概念 DB:数据库(database)相当于一个仓库,用于有组织的采存储数据. DBMS:数据库管理系统(database manage system)数据库是通过DBMS来创建和操作,种类很多( ...

  9. 知方可补不足~Sqlserver发布订阅与sql事务的关系

    回到目录 前几讲说了一下通过sqlserver的发布与订阅来实现数据的同步,再通过EF这个ORM架构最终实现架构系统的读写分离,而在使用发布与订阅来实现数据同步时,需要我们注意几点,那就是当操作被使用 ...

  10. SQL笔记----在一个关系表中操作列

    使用alter关键字,可以为一个表添加新的列. 比如: 给Persons的表中添加一列,名字为Birthday,类型是date. ALTER TABLE Persons ADD Birthday da ...

随机推荐

  1. Python——Html(表格<table>, <tr>,<td>,<th>、表单<form>、自定义标签<div>和<span>)

    一.表格<table>, <tr>,<td>或<th> <table> 元素是 HTML 中用于创建表格的主要标记.表格是一种用于展示数据的 ...

  2. C#开源的一款友好的.NET SDK管理器

    前言 今天推荐一款由C#开源的.友好的.NET SDK管理器:Dots. 工具介绍 Dots 是一款 .NET SDK 管理器,可让您轻松安装.卸载和切换 .NET SDK.它是一款跨平台工具,可在 ...

  3. Http 编码格式简介

    Http 格式简介 Http 是用于在客户端和服务端之间进行通信的一种消息格式,一般由以下几个部分组成: 起始行:这部分在 Http 响应中也被称为状态行,针对不同的 Http 类型,其中包含的内容也 ...

  4. 实现两个 JSON 对象的对比

    问题描述 在 Java 中,对于两个对象的对比,如果没有重写 equals 方法,那么将会默认使用 Object 默认的 equals 方法来比较两个对象.这种比较方式是通过比较两个对象的内存地址是否 ...

  5. 调用含有header的WebService时,跳过证书验证

    最近在做Webservice的接口调用,header的用户名和密码都是正确的,地址也是对的,但一直提示:基础连接已关闭,未能与SSL/TLS安全通道建立信任关系. 解决方案: 请求之前加上下面得代码即 ...

  6. 2023-11-01:用go语言,沿街有一排连续的房屋。每间房屋内都藏有一定的现金, 现在有一位小偷计划从这些房屋中窃取现金, 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋, 小

    2023-11-01:用go语言,沿街有一排连续的房屋.每间房屋内都藏有一定的现金, 现在有一位小偷计划从这些房屋中窃取现金, 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋, 小 ...

  7. 通过鼠标拖拉获取图片原像素的两个点坐标vue

    <template> <div> <img class="no-drag" ref="image" src="https ...

  8. GeminiDB Cassandra接口新特性PITR发布:支持任意时间点恢复

    本文分享自华为云社区<GeminiDB Cassandra接口新特性PITR发布:支持任意时间点恢复>,作者: GaussDB 数据库. 技术背景 当业务发生数据损毁.数据丢失.数据误删除 ...

  9. 华为云FusionInsight助力宇宙行打造金融数据湖新标杆

    摘要:工行采用了华为云FusionInsight MRS大数据存算分离方案,实现了大数据平台与OBS对象存储服务的对接,将原有的HDFS数据无缝迁移到OBS上.在保证性能的前提下,实现了计算与存储独立 ...

  10. Colocate Join :ClickHouse的一种高性能分布式join查询模型

    摘要:本文将介绍业界MPP分布式数据库join查询模型,以及ClickHouse的分布式查询原理解析和Colocate join性能表现. 本文分享自华为云社区<ClickHouse一种高性能分 ...