关于GEO类型字面量及通用GEO列支持的技术咨询
不同数据库对GEO类型的处理差异
部分数据库支持各类GEO类型字面量,比如Postgres中可执行以下语句:
SELECT POINT '1,1';
Postgres会在列级别强制子类型,执行下述语句时会报错:
SELECT POINT '1,1' UNION ALL SELECT LINE '0,0,1,1';
ERROR: UNION could not convert type line to point
但像BigQuery这类数据库允许同一列存在多种GEO类型。针对这类场景,以下是对应技术问题的解答:
问题1:是否可直接使用GEO|GEOMETRY|GEOGRAPHY关键字创建字面量,例如执行SELECT GEO '1,1' FROM tbl?
这取决于具体数据库的实现:
- Postgres:不支持直接用
GEO关键字创建字面量,必须明确指定具体子类型(如POINT、LINE、POLYGON等)。不过PostGIS扩展支持GEOMETRY类型,可通过ST_GeomFromText函数创建通用几何对象,比如SELECT ST_GeomFromText('POINT(1 1)');,但直接写GEOMETRY '1,1'这类语法不生效。 - BigQuery:支持
GEOGRAPHY关键字直接创建字面量,比如SELECT GEOGRAPHY 'POINT(1 1)',同时GEO是GEOGRAPHY的简写,因此SELECT GEO 'POINT(1 1)' FROM tbl可正常执行。 - MySQL:支持
GEOMETRY类型,但需通过ST_GeomFromText这类函数创建对象,不能直接用GEOMETRY '1,1'的字面量语法。
问题2:是否能创建支持任意子类型的GEO列?
同样需结合具体数据库实现来看:
- Postgres:原生几何类型不行,必须指定具体子类型。但安装PostGIS扩展后,可使用
GEOMETRY类型列存储任意几何子类型,创建语法为CREATE TABLE tbl (geo_col GEOMETRY);。 - BigQuery:可以。BigQuery的
GEOGRAPHY类型本身支持存储任意地理对象(点、线、多边形等),创建列时直接指定GEOGRAPHY类型即可,同一列可混合存储不同类型的地理数据。 - MySQL:可以使用
GEOMETRY类型列,它能存储任意几何子类型,创建语法为CREATE TABLE tbl (geo_col GEOMETRY);,插入不同类型几何对象时通过函数转换即可。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

