tidb的json字段是否有大小限制,超过大小会被截断么?

【TiDB 使用环境】生产环境
【TiDB 版本】v7.1.5
【操作系统】
【部署方式】云上部署(什么云)/机器部署(什么机器配置、什么硬盘)
【集群数据量】
【集群节点数】
【问题复现路径】做过哪些操作出现的问题
往json字段中写入数据,有一条长度比较大的值,直接查询发现变成了base64格式,可以通过相关函数解析回json
【遇到的问题:问题现象及影响】
发现只有一条很长的值变成了base64格式,且反解析后是被截断的json值,详情见截图。

  1. json类型的值的长度上限是多少?
  2. 能否配置超过长度后直接报错而不是截断?

【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【复制黏贴 ERROR 报错的日志】
【其他附件:截图/日志/监控】

不确定是哪里问题,你试试调下行的最大限制看看能解决吗

TiDB 中 JSON 类型的值存储为 LONGBLOB ,理论上最大支持 4GB 的单个 JSON 值,但是实际收到上面哪个参数的限制,如果你一行大小超过txn-entry-size-limit,会直接报错

应该有大小的限制,不过应该都可以调整的,看下文档。

数据太大,小心事务问题…

理论上,数据很大,那么这些数据会先在内存中,事务提交了才会落盘,这个过程会比较吃内存资源了

有限制,单个json的最大值为6M。超过不会截断,直接报错

应该是65536
image
https://docs.pingcap.com/zh/tidb/stable/error-codes/

1 个赞

image
txn-entry-size-limit 已经是100M了,单条数据应该是几百K,没有特别大
@zhanggame1 @tidb菜鸟一只

现在的问题是没有报错,而是直接被截断了,sql_mode也是默认的严格模式

我看上面说的是转为 base64 了,这里说截断了,具体情况是啥?

个人推荐试试一样数据一个程序 写 mysql 看看啥行为。
最好可以提供一个测试案例 我们本地调试下试试 :thinking:

补充下 tidb 的 json 格式:https://docs.pingcap.com/zh/tidb/stable/data-type-json/

建议抓包,我估计是发个数据库的可能就有问题

业务使用的是gorm写入的,MySQL是正常,TiDB使用有问题,具体场景和复现方式可以看这个帖子:tidb插入超长json 被截断了且没有报错 - #5,来自 tug_twf ,后续在新帖子讨论吧,本帖先关了