You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js客户端更新Supabase qr_code字段报btree索引行超限错误

问题现象

在Next.js应用中通过Axios向Supabase发送patch请求更新数据时,触发如下数据库报错:

{
    "message": "index row size 3040 exceeds btree version 4 maximum 2704 for index \"guests_list_qr_code_url_key\"",
    "code": "54000",
    "details": "Index row references tuple (1130,6) in relation \"guests_lists\".",
    "hint": "Values larger than 1/3 of a buffer page cannot be indexed.\nConsider a function index of an MD5 hash of the value, or use full text indexing."
}

触发操作仅为在请求体中传入data:image格式的base64值更新qr_code字段,请求体结构如下:

{
    "qr_code": "data:image/png;base64,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"
}

此前在其他项目中使用supabase-js库实现相同逻辑可正常运行,需要相关排查线索。


排查进展

更新1

测试发现客户端侧使用supabase-js发起相同请求也会报错,但服务端侧无论使用supabase-js还是Axios发起请求均可正常执行,暂无法确定问题是否和数据库配置相关,存在客户端/服务端请求来源表现不一致的现象。

更新2

经对比确认,问题直接触发原因是客户端侧生成的QR码图片长度大于服务端侧生成结果,对比数据如下:

{
  "equals": false,
  "qr_fe_length": 2918,
  "qr_be_length": 1774
}

项目使用node-qrcode库生成二维码,核心生成代码如下:

const qr_code = await QRCode.toDataURL("34624727-f4f8-43d1-95d9-b5887be65da3")

两端均传入相同的uuid值作为二维码内容,且调用完全相同的生成代码输出data:image格式二维码,但最终生成结果长度存在明显差异。


问题根因与解决方案

直接原因

报错来自PostgreSQL的B树索引限制:默认8KB缓存页下,B树索引单条记录值不能超过页大小的1/3(约2704字节)。当前qr_code字段被加了唯一约束,数据库自动为其创建了名为guests_list_qr_code_url_key的B树索引,客户端生成的二维码base64长度达2918,超过索引上限触发报错;服务端生成的二维码长度仅1774,低于阈值所以可以正常写入。

两端生成二维码长度不一致原因

node-qrcode在浏览器端和Node.js运行时的默认生成参数存在隐式差异,包括默认边距、纠错等级、缩放比例等配置不统一,最终输出的PNG图片体积不同,base64编码后长度就会出现差距。

可选解决方向

  • 优先移除qr_code字段的唯一约束:二维码base64内容本身不需要做唯一性校验,唯一约束应该加在存储uuid的业务字段上,从根源上避免大字段走索引校验
  • 显式指定二维码生成参数:调用toDataURL时固定margin、errorCorrectionLevel、scale等配置,保证两端生成的二维码体积稳定,base64长度低于2704字节
  • 优化存储方式:不要将base64格式的二维码直接存入数据库字段,改为上传到对象存储服务,数据库仅存储文件访问路径,彻底规避大字段写入问题

内容的提问来源于stack exchange,提问作者Diego Ulloa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:36:16