如何在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
相关产品推荐
相关产品推荐

