You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:46:03