Oracle 数据库中,存储 经纬度 主要有以下几种方式:

1. 使用 NUMBER 数据类型(最简单)

适用于大多数应用场景,直接用两个 NUMBER 字段存储 纬度(latitude)经度(longitude)

CREATE TABLE locations (
    id NUMBER PRIMARY KEY,
    latitude NUMBER(9,6),   -- 纬度,精确到小数点后6位
    longitude NUMBER(9,6)   -- 经度,精确到小数点后6位
);
  • 优点:简单易用,适用于查询和计算。
  • 缺点:不支持地理空间计算,查询计算复杂。

2. 使用 SDO_GEOMETRY(支持空间计算)

如果要进行 地理空间查询(GIS 计算,如查找附近位置、测距等),建议使用 Oracle Spatial & Graph 提供的 SDO_GEOMETRY 数据类型:

CREATE TABLE locations (
    id NUMBER PRIMARY KEY,
    location SDO_GEOMETRY
);

然后插入数据:

INSERT INTO locations (id, location)
VALUES (1, SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(113.323, 23.108, NULL), NULL, NULL));
  • 2001 代表点(Point)
  • 8307 是 WGS-84 坐标系(常用于 GPS)
  • SDO_POINT_TYPE 存储 (longitude, latitude, NULL)

查询时,可以用 SDO_GEOMETRY 进行空间计算:

SELECT id FROM locations
WHERE SDO_WITHIN_DISTANCE(location, SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(113.323, 23.108, NULL), NULL, NULL), 'distance=1000') = 'TRUE';

(查找 1000米范围内的地点

  • 优点:支持 空间索引GIS 查询,适用于地理位置计算。
  • 缺点:需要安装 Oracle Spatial 扩展,学习成本较高。

3. 使用 VARCHAR2 存储(不推荐)

也可以将 经纬度 存储为 字符串,但不利于计算:

CREATE TABLE locations (
    id NUMBER PRIMARY KEY,
    coordinates VARCHAR2(50) -- 存储格式如 '23.108,113.323'
);

缺点:查询、计算困难,不推荐。

总结

方式适用场景计算支持适用性
NUMBER普通存储、简单查询需要手写计算逻辑⭐⭐⭐⭐
SDO_GEOMETRY需要地理计算、范围查询Oracle GIS 计算⭐⭐⭐⭐⭐
VARCHAR2仅用于显示几乎无法计算

如果只是存储和简单查询,经纬度用 NUMBER 最方便。如果需要 空间计算,用 SDO_GEOMETRY 才是最优解。