了解导致 MySQL 错误 1416 的原因以及Cannot get geometry object from data解决办法。
我开始在 MySQL 中探索我从未在实际项目中使用过的新数据类型。由于MySQL 支持 Spatial 数据类型,因此将位置坐标存储到数据库表的 Point 类型列中似乎非常方便。在使用 PHPMyAdmin 插入表单(我想测试它的外观)插入新行这样简单的操作之后,可以使用如下所示的表单插入 Point 类型列的点:
填写表单并尝试插入记录后,以下生成的查询会出现此错误:
INSERT INTO `tableName`
(`id`, `name`, `coordinates`)
VALUES
(NULL, 'My First Record', '\'POINT(40.71727401 -74.00898606)\',0')
此查询将抛出上述错误:1416 - Cannot get geometry object from data you send to the GEOMETRY field。发生这种情况是因为查询无效。为防止出现此异常,你需要修复查询以匹配 MySQL 或 MariaDB 的当前版本,那么如何修复错误Cannot get geometry object from data?
Cannot get geometry object from data解决办法:更正查询语法
空间列中的数据需要存储为空间数据。这些值应以内部几何格式存储,但你可以将它们从 Well-Known Text (WKT) 或 Well-Known Binary (WKB) 格式转换为该格式。
在较新版本的 MySQL 中,使用 Point 插入查询将起作用:
INSERT INTO `tableName`
(`id`, `name`, `coordinates`)
VALUES
(NULL, 'My First Record', POINT(40.71727401 -74.00898606))
由于 Point(X,Y) 函数基本上是一个精确数字的构造函数,不需要先转换为文本,因此速度更快。它还保证返回一个点或失败。
但是,对于旧版本的 MySQL 和 MariaDB,你将被迫使用速度较慢的 Well-Known text (WKT) 构造函数。在旧版本中,可以在没有前缀的情况下找到这些函数,因此只要它可用,请务必使用带有前缀的版本。 ST_
ST_
- ST_GeomFromText(wkt, srid) 可以返回MySQL 支持的任何空间类型,可以用 WKT 表示。如果你想这样想的话,这会使其打字松散。
- ST_PointFromText(wkt, srid)来自知名文本 的强类型构造函数。
POINT
如何修复修复错误Cannot get geometry object from data?以下示例演示了如何通过将 WKT 值转换为其内部几何格式(如果ST_GeomFromText
不可用,请GeomFromText
改用)来将相同的数据几何值插入表中:
INSERT INTO `tableName`
(`id`, `name`, `coordinates`)
VALUES
(NULL, 'My First Record', ST_GeomFromText('POINT(40.71727401 -74.00898606)', 0));
即使你不使用 SRID(空间参考系统 ID),你也可以在没有此值的情况下插入点:
INSERT INTO `tableName`
(`id`, `name`, `coordinates`)
VALUES
(NULL, 'My First Record', ST_GeomFromText('POINT(40.71727401 -74.00898606)'))
快乐编码❤️!