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

