我必须将数据从 MySQL 迁移到 PostgreSQL。我遇到了一个与几何数据类型有关的问题,但 db 以自己的方式处理它们。 在 mysql 中,多边形数据类型列以十六进制类型存储数据,而在 postgres 中,它以某种文本形式保存。 因此,主要的挑战是以最少的额外工作来迁移数据,即我有多个数据库,并且我正在使用 AWS DMS 来传输数据,因此我希望以最少的停机时间来处理此问题。
我首先尝试在导入的数据上使用像
st_geomfromwkb()
这样的PostGis函数,但它不起作用。只有当我首先使用 st_asbinary()
将多边形列数据转换为二进制,然后删除前两个字母“0x”十六进制表示,然后执行类似的操作时,它才有效。
SELECT ST_AsText(ST_GeomFromWKB( decode('01030000000100000005000000FA570C8A1F8A54C0A500FFCB430A3E40FA570C8A1F8A54C086C93ECB9FB83E40F2DFAD8D615154C086C93ECB9FB83E40F2DFAD8D615154C0A500FFCB430A3E40FA570C8A1F8A54C0A500FFCB430A3E40', 'hex'), 4326));
所以最后我只剩下一种方法,在mysql表中添加一个额外的列,将多边形数据类型坐标转换为文本类型并迁移整个表,然后用我们可以从文本中获取的值替换原始的多边形列 类似的东西
MySQL
alter table t1 add column temp longtext;
select id, st_astext(polygon) as polygon from beepermd_jeremy.location;
->POLYGON((0 0,0 1,1 1,1 0,0 0))
PostgreSQL
update t1 set polygon= st_geomfromtext('POLYGON((0 0,0 1,1 1,1 0,0 0))');
CREATE TABLE test (
id INT AUTO_INCREMENT PRimarY KEY,
geom GEOMETRY
);
INSERT INTO test (geom)
SELECT st_geomfromtext('MULTILINESTRING((10 10, 11 11), (9 9, 10 10))')
UNION ALL
SELECT st_geomfromtext('MULTIPOINT (1 1, 2 2, 3 3)');
SELECT * FROM test;
ALTER TABLE test
CHANGE COLUMN geom geom_as_binary GEOMETRY INVISIBLE,
ADD COLUMN geom TEXT AS (st_astext(geom_as_binary)) AFTER id;
SELECT * FROM test;