[转帖]max_allowed_packet 与 SQL 长度的关系
https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000210013
租户变量 max_allowed_packet 用于设置最大网络包大小,单位是 Byte。
| 属性 | 描述 |
|---|---|
| 参数类型 | int |
| 默认值 | 4194304 |
| 取值范围 | [1024,1073741824] |
| 生效范围 |
|
| 是否参与序列化 | 是 |
| 是否可修改 | 该变量可通过 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 长度的关系的更多相关文章
- mysql sql长度限制解决
mysql sql长度限制解决 今天发现了一个错误: Could not execute JDBC batch update 最后发现原因是SQL语句长度大于1M,而我机器上的mysql是 ...
- [转帖]EXPDP dumpfile和parallel的关系
http://blog.itpub.net/28602568/viewspace-2133375/ 转帖 EXPDP 里面 parallel 与 dumpfile 里面的文件数的关系. 但是我这里有一 ...
- (转帖)oracle sql 语句优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- [转帖]oracle改版sql server问题点汇总
https://www.cnblogs.com/zhangdk/p/oracle_sqlserver.html 只记得 最开始的时候看过 没有具体的了解里面的特点 原作者总结的很好 留下来 以后说不定 ...
- java.util.Date与java.sql.Date的关系和转换方法(转)
在ResultSet中我们经常使用的setDate或getDate的数据类型是java.sql.Date,而在平时java程序中我们一般习惯使用 java.util.Date. 因此在DAO层我们经常 ...
- 【转帖】关于sql server 2008 的mdf收缩问题
原帖地址:http://social.msdn.microsoft.com/forums/windowsazure/pt-br/388f92e1-9a1e-497d-bde1-6664561fd44e ...
- Hibernate 三种状态变化 与 sql 语句的关系
前言:在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来发现它是重要的.对于理解hibernate,JVM和sql的关系有更好的 ...
- (一)DB、DBMS、SQL之间的关系
一.概念 DB:数据库(database)相当于一个仓库,用于有组织的采存储数据. DBMS:数据库管理系统(database manage system)数据库是通过DBMS来创建和操作,种类很多( ...
- 知方可补不足~Sqlserver发布订阅与sql事务的关系
回到目录 前几讲说了一下通过sqlserver的发布与订阅来实现数据的同步,再通过EF这个ORM架构最终实现架构系统的读写分离,而在使用发布与订阅来实现数据同步时,需要我们注意几点,那就是当操作被使用 ...
- SQL笔记----在一个关系表中操作列
使用alter关键字,可以为一个表添加新的列. 比如: 给Persons的表中添加一列,名字为Birthday,类型是date. ALTER TABLE Persons ADD Birthday da ...
随机推荐
- 一个简单的Python暴力破解网站登录密码脚本
目录: 关键代码解释 完整代码 方法一 运行结果 方法二 运行结果 测试靶机为DVWA,适合DVWA暴力破解模块的Low和Medium等级 关键代码解释 url指定url地址 url = " ...
- 文心一言 VS 讯飞星火 VS chatgpt (30)-- 算法导论5.2 2题
二.在 HIRE-ASSISTANT 中,假设应聘者以随机顺序出现,你正好雇用两次的概率是多少? 文心一言: 我们可以先计算出在HIRE-ASSISTANT中,雇佣一个应聘者的概率为3/4,然后计算出 ...
- C++篇:第十三章_异常_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 十三.异常 ① 函数指针与该指针所指的函数必须具有一致的noexcept异常说明 ...
- 扎根CNCF社区贡献五年是怎样的体验?听听华为云原生开源团队的负责人怎么说
摘要:本月我们要重点介绍王泽锋(Kevin Wang),他是 CNCF 社区的长期贡献者,华为云原生开源团队的负责人,KubeEdge 和 Volcano 项目的联合创始人.Kevin 回答了几个关于 ...
- Java开发如何通过IoT边缘ModuleSDK进行进程应用的开发?
摘要:为解决用户自定义处理设备数据以及自定义协议设备快速接入IOT平台的诉求,华为IoT边缘提供ModuleSDK,用户可通过集成SDK让设备以及设备数据快速上云. 本文分享自华为云社区<[华为 ...
- DevCloud加持下的青软,让教育“智”上云端
摘要:构建多体系人才云实践环境,提供企业所需人才培养平台,构建以学习为中心的全新教育生态. 本文分享自华为云社区<[云享·伙伴]第5期:华为云DevCloud加持下的青软,让教育"智& ...
- 云小课|ModelArts Pro 视觉套件:零代码构建视觉AI应用
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:ModelArts ...
- 华为云发布ModelBox AI应用开发框架
摘要:华为云ModelBox AI应用开发框架,打通端边云边界,助力开发者实现AI应用一次开发,全场景部署. 近日,以"因聚而生,为你所能"为主题的华为伙伴暨开发者大会 2022隆 ...
- 华为云GaussDB(for Influx)揭秘第五期:最佳实践之子查询
摘要: GaussDB(for influx)提供灵活的子查询能力,满足海量数据场景下的高性能查询需求. 本文分享自华为云社区<华为云GaussDB(for Influx)揭秘第五期:最佳实践之 ...
- 详解4种微服务框架接入Istio方案
摘要:使用k8s和lstio网格进行开发,将服务发现.服务治理留给基础设施,可以将开发人员从复杂的服务中解脱出来,专注于业务开发,是当前来说比较好的解决方案. 本文分享自华为云社区<传统微服务框 ...