11.4.3 支持的空间数据格式

两种标准空间数据格式用于 table 示查询中的几何对象:

  • 知名 Literals(WKT)格式

  • 众所周知的二进制(WKB)格式

在内部,MySQL 以与 WKT 或 WKB 格式不同的格式存储几何值。 (内部格式类似于 WKB,但以 4 个初始字节 table 示 SRID.)

有一些功能可以在不同的数据格式之间进行转换。参见第 12.16.6 节“几何格式转换函数”

以下各节描述了 MySQL 使用的空间数据格式:

众所周知的文本(WKT)格式

几何值的熟知文本(WKT)table 示旨在交换 ASCII 形式的几何数据。 OpenGIS 规范提供了 Backus-Naur 语法,该语法指定用于编写 WKT 值的正式生产规则(请参见第 11.4 节“空间数据类型”)。

WKT 几何对象 table 示的示例:

  • A Point
POINT(15 20)

指定的点坐标不带逗号。这与 SQL Point()函数的语法不同,后者需要在坐标之间使用逗号。注意使用适合给定空间操作上下文的语法。例如,以下语句都使用ST_X()Point对象提取 X 坐标。第一个直接使用Point()函数生成对象。第二种使用 WKTtable 示形式,将ST_GeomFromText()转换为Point

mysql> SELECT ST_X(Point(15, 20));
+---------------------+
| ST_X(POINT(15, 20)) |
+---------------------+
|                  15 |
+---------------------+

mysql> SELECT ST_X(ST_GeomFromText('POINT(15 20)'));
+---------------------------------------+
| ST_X(ST_GeomFromText('POINT(15 20)')) |
+---------------------------------------+
|                                    15 |
+---------------------------------------+
  • 具有四个点的LineString
LINESTRING(0 0, 10 10, 20 25, 50 60)

点坐标对以逗号分隔。

  • 具有一个外环和一个内环的Polygon
POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
  • 具有三个Point值的MultiPoint
MULTIPOINT(0 0, 20 20, 60 60)

从 MySQL 5.7.9 开始,接受MultiPoint值的 WKT 格式 table 示的空间函数(例如ST_MPointFromText()ST_GeomFromText())允许值内的各个点用括号括起来。例如,以下两个函数调用均有效,而在 MySQL 5.7.9 之前的第二个函数调用会产生错误:

ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)')
ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))')

从 MySQL 5.7.9 开始,MultiPoint值的输出在每个点周围都包含括号。例如:

mysql> SET @mp = 'MULTIPOINT(1 1, 2 2, 3 3)';
mysql> SELECT ST_AsText(ST_GeomFromText(@mp));
+---------------------------------+
| ST_AsText(ST_GeomFromText(@mp)) |
+---------------------------------+
| MULTIPOINT((1 1),(2 2),(3 3))   |
+---------------------------------+

在 MySQL 5.7.9 之前,相同值的输出在每个点周围不包含括号:

mysql> SET @mp = 'MULTIPOINT(1 1, 2 2, 3 3)';
mysql> SELECT ST_AsText(ST_GeomFromText(@mp));
+---------------------------------+
| ST_AsText(ST_GeomFromText(@mp)) |
+---------------------------------+
| MULTIPOINT(1 1,2 2,3 3)         |
+---------------------------------+
  • 具有两个LineString值的MultiLineString
MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
  • 具有两个Polygon值的MultiPolygon
MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
  • GeometryCollection由两个Point值和一个LineString组成:
GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))

众所周知的二进制(WKB)格式

几何值的众所周知的二进制(WKB)table 示用于交换几何数据,作为由包含几何 WKB 信息的BLOB值 table 示的二进制流。此格式由 OpenGIS 规范定义(请参见第 11.4 节“空间数据类型”)。它还在 ISO * SQL/MM 第 3 部分:空间*标准中定义。

WKB 使用 1 字节无符号整数,4 字节无符号整数和 8 字节双精度数字(IEEE 754 格式)。一个字节是八位。

例如,对应于POINT(1 -1)的 WKB 值由 21 个字节的序列组成,每个字节由两个十六进制数字 table 示:

0101000000000000000000F03F000000000000F0BF

序列由下 table 所示的组件组成。

table11.2 WKB 组件示例

ComponentSizeValue
Byte order1 byte01
WKB type4 bytes01000000
X coordinate8 bytes000000000000F03F
Y coordinate8 bytes000000000000F0BF

组件 table 示如下:

  • 字节 Sequences 指示符为 1 或 0table 示小端或大端存储。小字节序和大字节序分别也称为网络数据 table 示(NDR)和外部数据 table 示(XDR)。

  • WKB 类型是指示几何类型的代码。 MySQL 使用从 1 到 7 的值来 table 示PointLineStringPolygonMultiPointMultiLineStringMultiPolygonGeometryCollection

  • Point值具有 X 和 Y 坐标,每个坐标都 table 示为双精度值。

如 OpenGIS 规范中所述,用于更复杂的几何值的 WKB 值具有更复杂的数据结构。

内部几何存储格式

MySQL 使用 4 个字节存储几何值,以指示 SRID,后跟该值的 WKBtable 示。有关 WKB 格式的说明,请参见众所周知的二进制(WKB)格式

对于 WKB 部分,这些特定于 MySQL 的注意事项适用:

  • 字节 Sequences 指示符字节为 1,因为 MySQL 将几何存储为低端值。

  • MySQL 支持PointLineStringPolygonMultiPointMultiLineStringMultiPolygonGeometryCollection的几何类型。不支持其他几何类型。

LENGTH()函数返回值存储所需的字节空间。例:

mysql> SET @g = ST_GeomFromText('POINT(1 -1)');
mysql> SELECT LENGTH(@g);
+------------+
| LENGTH(@g) |
+------------+
|         25 |
+------------+
mysql> SELECT HEX(@g);
+----------------------------------------------------+
| HEX(@g)                                            |
+----------------------------------------------------+
| 000000000101000000000000000000F03F000000000000F0BF |
+----------------------------------------------------+

值的长度是 25 个字节,由以下部分组成(从十六进制值可以看出):

  • 4 个字节,用于整数 SRID(0)

  • 1 个字节,table 示整数字节 Sequences(1 =小字节序)

  • 4 个字节,用于整数类型信息(1 = Point)

  • 8 个双精度 X 坐标字节(1)

  • 8 个双精度 Y 坐标的字节(-1)