如何通过Trino提取MariaDB中POINT类型的坐标值?
解决Trino读取MariaDB POINT类型数据的问题
你遇到的乱码是因为MariaDB的POINT类型以WKB(Well-Known Binary)二进制格式存储,Trino转为VARCHAR后直接显示了二进制的字符形式,并非可读文本。以下两种方案可解决问题:
方案1:在MariaDB端直接提取坐标(推荐)
利用MariaDB的地理函数直接将POINT类型解析为坐标值或文本格式,让Trino读取现成的数值/字符串:
- 直接提取经度和纬度:
SELECT ST_X(location) AS longitude, ST_Y(location) AS latitude FROM x.y.z
- 转成可读的POINT文本字符串(后续可在Trino中拆分):
SELECT ST_AsText(location) AS location_text FROM x.y.z
执行后Trino会拿到类似POINT(51.566682 83.32865)的文本,再用Trino字符串函数拆分坐标:
SELECT cast(split(split(location_text, ' ')[1], '(')[2] AS double) AS longitude, cast(split(split(location_text, ' ')[2], ')')[1] AS double) AS latitude FROM ( SELECT ST_AsText(location) AS location_text FROM x.y.z ) t
方案2:在Trino端解析WKB二进制
若无法修改源查询,可在Trino里把乱码的VARCHAR转回二进制,解析WKB格式的POINT数据:
WKB的POINT结构为:1字节字节序(0=大端,1=小端)、4字节类型码、8字节经度、8字节纬度。示例代码(假设为小端字节序):
SELECT from_bytes(substring(to_utf8(location), 6, 8), 'LITTLE_ENDIAN') AS longitude, from_bytes(substring(to_utf8(location), 14, 8), 'LITTLE_ENDIAN') AS latitude FROM x.y.z
如果结果不符,将LITTLE_ENDIAN替换为BIG_ENDIAN尝试,不同数据库环境字节序可能存在差异。
内容的提问来源于stack exchange,提问作者Antônio Rodrigues
相关产品推荐
相关产品推荐

