【发布时间】:2020-04-07 16:10:10
【问题描述】:
我正在尝试使用空间数据类型,与其他编程主题相比,我发现这些类型在互联网上的理解并不那么广泛。
我有一张表,其中包含地图上的对象。理论上,坐标在任何方向上从 0,0 到无穷大。地图上的一个点不能超过 1 个对象,所以我设计了这样的表格:
CREATE TABLE `map_objects` (
`name` varchar(255) DEFAULT NULL,
`position` point NOT NULL,
`type` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`position`(25)),
SPATIAL KEY `position_2` (`position`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
到目前为止一切顺利,我可以使用空间扩展提供的各种几何函数来选择对象,但是我真的不明白Point 里面是什么,为什么它有 25 个字节长?令人惊讶的是,它几乎没有在任何地方记录。我发现了一些我在另一个项目中使用的旧代码,我曾经在其中获取二进制点并在我的应用程序逻辑中提取坐标(出于某种原因):
unpack('x/x/x/x/co/Lt/dlat/dlng', $point);
这告诉我前四个字节是空的,然后是一个字符,一个长整数和坐标的双精度数。我非常怀疑开头的字节实际上是未使用的,可能是我复制此代码的那个字节不需要它们。无论是哪种情况,我目前都可以通过只知道坐标来选择地图上的对象:
SELECT * FROM map_objects WHERE position = ST_GeomFromText('Point(1 1)')
这又应该意味着除了坐标之外的所有字节都可以由MySQL在执行时生成,这意味着它们是微不足道的?将它们放在Point 列中的意义是什么?
另外理论上应该可以通过提供25个二进制字节并使用equals运算符来选择记录,但我的尝试实际上失败了,我只是返回空结果,这是为什么?
【问题讨论】:
-
你真的在问 MySQL
Point类型的值是如何编码的吗? -
@LightnessRaceswithMonica 本质上。我和很多其他人一样,可能还不够熟练,无法深入挖掘如此复杂程序的源头。我花了很长时间搜索这个信息,但我找不到它,问有什么害处?我想了解我正在使用的工具的工作原理,我相信这就是区分好工程师和坏工程师的原因。
-
@LightnessRaceswithMonica 我只是假设你的语气似乎很嘲讽,我很抱歉。
-
哦,对不起,我实际上可以看到它是如何阅读的。我的意思是“不是问Point是什么,而是实际上问它是如何工作的”......而不是“你诚实地问这个问题吗?你怎么了? ?” ;)