在 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
才是最优解。