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

如何在Supabase JS中安全使用bigint类型

在Supabase中安全处理Postgres的64位bigint整数

Postgres的bigint类型存储的是64位整数,但JS的number类型是双精度浮点数,只能安全表示到2^53 - 1(即9007199254740991),超过这个范围的整数会丢失精度。而Supabase JS SDK默认会把bigint转为number返回,这就会导致大数精度丢失的问题,以下是几种靠谱的处理方式:

1. 查询时手动转成字符串

在写SQL查询的时候,直接把bigint字段转成字符串类型返回,这样前端拿到的就是完整的数字字符串,不会有精度损失。示例:

SELECT user_id::text, username FROM users;

后续如果需要在JS里做数值运算,再用BigInt()把字符串转成JS的BigInt类型即可。

2. 配置Supabase客户端自动转换类型

初始化Supabase客户端时,可以自定义类型转换器,让bigint自动转为BigInt或者字符串,避免手动改查询语句。示例:

import { createClient } from '@supabase/supabase-js';

const supabase = createClient('你的Supabase URL', '你的匿名密钥', {
  format: {
    // 自动把bigint转为JS BigInt类型
    bigint: (val) => BigInt(val),
    // 也可以选择转成字符串:bigint: (val) => val.toString()
  }
});

注意:用BigInt的话,和普通number运算时要注意类型兼容,比如需要把number转成BigInt再计算,避免类型错误。

3. 调整表字段类型(业务允许的话)

如果你的业务场景对整数类型要求没那么严格,可以考虑把bigint字段改成numeric类型。Postgres的numeric可以精确存储任意精度的数字,Supabase JS SDK会以字符串形式返回numeric值,同样能避免精度丢失。不过这种方式更适合不需要频繁整数操作的场景。

额外注意

  • 前端展示大数时,直接用字符串或BigInt转字符串即可,不会有显示问题。
  • 如果需要把数据提交回Supabase,不管是字符串还是BigInt,Supabase都能自动识别并转成对应的bigint或numeric类型,不用额外处理。

内容的提问来源于stack exchange,提问作者Sumit Ghosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:10:18