两种标准空间数据格式用于表示查询中的几何对象:
- 知名文本 (WKT) 格式 
- 众所周知的二进制 (WKB) 格式 
在内部,MySQL 以与 WKT 或 WKB 格式不同的格式存储几何值。(内部格式类似于 WKB,但有一个初始的 4 个字节来指示 SRID。)
有一些函数可以在不同的数据格式之间进行转换;参见第 12.17.6 节,“几何格式转换函数”。
以下部分描述了 MySQL 使用的空间数据格式:
几何值的 Well-Known Text (WKT) 表示旨在以 ASCII 形式交换几何数据。OpenGIS 规范提供了一个 Backus-Naur 语法,它指定了写入 WKT 值的正式生产规则(请参阅第 11.4 节,“空间数据类型”)。
几何对象的 WKT 表示示例:
- 答 - Point:- POINT(15 20)- 指定的点坐标没有分隔逗号。这与 SQL - Point()函数的语法不同,后者需要在坐标之间使用逗号。注意使用适合给定空间操作上下文的语法。例如,以下语句都用于 从对象- ST_X()中提取 X 坐标。- Point第一个直接使用- Point()函数生成对象。第二个使用 WKT 表示形式转换为- Pointwith- ST_GeomFromText()。- 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 | +---------------------------------------+
- A - LineString有四点:- LINESTRING(0 0, 10 10, 20 25, 50 60)- 点坐标对以逗号分隔。 
- Polygon带一个外环和一个内环 的 A :- POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
- MultiPoint具有三个- Point值 的 A :- MULTIPOINT(0 0, 20 20, 60 60)- 从 MySQL 5.7.9 开始,诸如 - ST_MPointFromText()和 之类的空间函数- ST_GeomFromText()接受 WKT 格式的- MultiPoint值表示,允许值中的各个点被括号包围。例如,以下两个函数调用都是有效的,而在 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) | +---------------------------------+
- A - MultiLineString有两个- LineString值:- MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
- A - MultiPolygon有两个- Polygon值:- MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
- A - GeometryCollection由两个- Point值和一个 组成- LineString:- GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
          几何值的 Well-Known Binary (WKB) 表示用于将几何数据交换为由BLOB包含几何 WKB 信息的值表示的二进制流。此格式由 OpenGIS 规范定义(请参阅
          第 11.4 节“空间数据类型”)。它也在 ISO SQL/MM 第 3 部分:空间标准中定义。
        
WKB 使用 1 字节无符号整数、4 字节无符号整数和 8 字节双精度数(IEEE 754 格式)。一个字节是八位。
          例如,对应的 WKB 值POINT(1
          -1)由以下 21 个字节序列组成,每个字节由两个十六进制数字表示:
        
0101000000000000000000F03F000000000000F0BF该序列由下表中显示的组件组成。
表 11.2 WKB 组件示例
| 零件 | 尺寸 | 价值 | 
|---|---|---|
| 字节顺序 | 1字节 | 01 | 
| WKB型 | 4字节 | 01000000 | 
| X坐标 | 8字节 | 000000000000F03F | 
| Y坐标 | 8字节 | 000000000000F0BF | 
组件表示如下:
- 字节顺序指示符是 1 或 0,表示小端存储或大端存储。little-endian 和 big-endian 字节顺序也分别称为网络数据表示 (NDR) 和外部数据表示 (XDR)。 
- WKB 类型是表示几何类型的代码。MySQL 使用从 1 到 7 的值来表示 - Point,- LineString,- Polygon,- MultiPoint,- MultiLineString,- MultiPolygon, 和- GeometryCollection。
- 值 - Point具有 X 和 Y 坐标,每个坐标都表示为双精度值。
更复杂的几何值的 WKB 值具有更复杂的数据结构,如 OpenGIS 规范中所述。
MySQL 使用 4 个字节存储几何值以指示 SRID,后跟该值的 WKB 表示形式。有关 WKB 格式的说明,请参阅 Well-Known Binary (WKB) Format。
对于 WKB 部分,这些特定于 MySQL 的注意事项适用:
- 字节顺序指示符字节为 1,因为 MySQL 将几何存储为小端值。 
- MySQL 支持 - Point,- LineString,- Polygon,- MultiPoint,- MultiLineString,- MultiPolygon, 和 的几何类型- GeometryCollection。不支持其他几何类型。
          该LENGTH()函数返回值存储所需的字节空间。例子:
        
mysql> SET @g = ST_GeomFromText('POINT(1 -1)');
mysql> SELECT LENGTH(@g);
+------------+
| LENGTH(@g) |
+------------+
|         25 |
+------------+
mysql> SELECT HEX(@g);
+----------------------------------------------------+
| HEX(@g)                                            |
+----------------------------------------------------+
| 000000000101000000000000000000F03F000000000000F0BF |
+----------------------------------------------------+值长度为 25 个字节,由这些部分组成(从十六进制值可以看出):
- 整数 SRID (0) 的 4 个字节 
- 整数字节顺序为 1 个字节(1 = little-endian) 
- 4 个字节用于整数类型信息 (1 = - Point)
- 双精度 X 坐标 8 个字节 (1) 
- 8 个字节用于双精度 Y 坐标 (−1)