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

PostgreSQL建表存储负小数经纬度字段适用数据类型咨询

解答

首先直接回应你的核心疑问:

  • NUMERIC(别名DECIMAL)类型完全支持存储负数值,不存在无法保存负小数的问题,可以用来存储经纬度数据。

你当前建表语句中的经纬度字段定义存在精度配置错误:

  • NUMERIC的定义格式为NUMERIC(总有效位数, 小数部分位数),你写的NUMERIC(15,15)代表15位有效数字全部分配给小数部分,整数部分只能存储0,根本无法容纳-87这类整数部分非0的经度值,插入数据时会触发溢出报错。

针对经纬度场景的正确配置建议:

  • 经纬度的合法取值范围为:经度-180 ~ 180,纬度-90 ~ 90。如果需要保存你示例中-87.223655662这类小数点后9位的精度(足以满足绝大多数民用定位需求),将经纬度字段定义为NUMERIC(12,9)即可:总有效位共12位,其中3位分配给整数部分(可覆盖最大180的三位整数取值),9位分配给小数部分,完全满足存储要求。
  • 如果你不需要严格的定点精度,也可以选择DOUBLE PRECISION双精度浮点数类型存储经纬度,读写效率更高,仅存在可忽略的浮点精度误差,适合大多数定位类业务场景。

另外你语句中ride_length INTERVAL(1000)的写法也存在问题:主流数据库中INTERVAL类型的精度参数用于指定秒值的小数保留位数,合法取值范围通常为0~6,传入1000会触发语法错误,直接写INTERVAL即可满足常规时长存储需求。

修正后的参考建表语句如下:

CREATE TABLE may_2021 (
  ride_id INTEGER NOT NULL,
  rideable_type VARCHAR(50) NOT NULL,
  started_at TIMESTAMP NOT NULL,
  ended_at TIMESTAMP NOT NULL,
  ride_length INTERVAL NOT NULL,
  day_of_week INTEGER NOT NULL,
  start_station_name TEXT,
  start_station_id VARCHAR(75),
  end_station_name TEXT,
  end_station_id VARCHAR(75),
  start_lat NUMERIC(12,9) NOT NULL,
  start_lng NUMERIC(12,9) NOT NULL,
  end_lat NUMERIC(12,9) NOT NULL,
  end_lng NUMERIC(12,9) NOT NULL,
  member_casual TEXT
)

内容的提问来源于stack exchange,提问作者A.J. Bulloch II

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:15:40