什么是积分?

What is a Point?

我正在尝试使用空间数据类型,我发现与其他编程主题相比,这些类型在 Internet 上并没有被广泛理解。

我有一个 table,其中包含地图上的对象。理论上,坐标在任何方向上从 0,0 到无穷大。地图上的一个点不能有超过 1 个对象,所以我设计了 table 这样的:

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;

到目前为止一切顺利,我可以使用空间扩展提供的各种几何函数 select 个对象,但我不太明白 Point 里面的内容,为什么是 25 个字节长的?令人惊讶的是,几乎没有任何地方记录它。我发现了一些我在另一个项目中使用的旧代码,我曾在其中获取二进制点并在我的应用程序逻辑中提取坐标(出于某种原因):

unpack('x/x/x/x/co/Lt/dlat/dlng', $point);

这告诉我前四个字节是空的,然后是一个字符,一个长整型和坐标的双精度数。我非常怀疑开头的字节实际上没有被使用,可能是我从中复制这段代码的那个字节不需要它们。不管是什么情况,我目前只需要知道坐标就可以 select 地图上的一个对象:

SELECT * FROM map_objects WHERE position = ST_GeomFromText('Point(1 1)')

这反过来应该是说除了坐标之外的所有字节在执行的时候都可以被MySQL生成,也就是说它们是无意义的?将它们放在 Point 列中有什么

此外,理论上应该可以通过提供 25 个二进制字节并使用等于运算符来 select 一条记录,但我的尝试实际上失败了,我只得到空结果,为什么那?

这是well-known binary format:

For example, a WKB value that corresponds to POINT(1 -1) consists of this sequence of 21 bytes, each represented by two hexadecimal digits:

0101000000000000000000F03F000000000000F0BF
Component    | Size    | Value
Byte order   | 1 byte  | 01
WKB type     | 4 bytes | 01000000
X coordinate | 8 bytes | 000000000000F03F
Y coordinate | 8 bytes | 000000000000F0BF

大多数起始字节表明几何对象是 Point