还原 PHPMyAdmin 备份时如何更正"Cannot get geometry object from data you send to the GEOMETRY field"?



我有一些数据库使用MySQL中的POINT字段来存储几何数据。所有数据都以相同的方式添加:

GeomFromText( 'POINT( lat lng )' )

所有数据库备份和恢复都没有问题,只有一个例外。这个数据库和其他数据库在同一台服务器上,但在一个单独的CPanel帐户中。

当我尝试恢复该数据库时,会出现以下错误:"无法从发送到几何字段的数据中获取几何对象">

插入语句的一个例子是:

INSERT INTO `location` (`id`, `coords` , `new_coords`) VALUES
(1, '�a��[XJ@�˶x��', '�8z�%XJ@g�+����' ),
(3, '�n�w�/J@6���', '�n�w�/J@6���' ),
(4, '�  ��@J@.����', '� ��@J@.����');

我已经检查了数据,当我运行这个查询时,所有数据似乎都显示了有效的纬度和经度:

SELECT X( coords ) , Y( coords ) FROM location

一些记录返回0和0。所以我尝试将它们更新为NULL,但仍然会出现同样的错误。

当我尝试在勾选或不勾选"以十六进制表示法转储二进制列"选项的情况下导出时,我也会收到同样的错误。

是否有设置会导致此问题,或者只是数据中的某些内容?

如果是数据,修复方法是什么?

提前感谢:)

这是使用PHPMyAdmin 4.8.3从PHP 7.2.7上的Linux MariaDB服务器(10.1.37-MariaDB)导出,并使用PHP 7.2.10使用PHPMyAdmin 4.8.3导入WAMPServer 3.1.4(10.3.9-MariaDB)。请注意,这在WAMPServer 3.0.8 上也不起作用

我找到了一个解决方案,尽管最好能首先找出问题的原因。我使用PHP从数据库中提取数据,然后仅使用POINT()而不是使用GeomFromText("POINT(")重新保存数据。

1) 查询数据库中的数据:

SELECT id , X( coords ) AS x , Y( coords) AS y FROM location

2) 遍历行并将数据存储在变量中。将任何空lng/lat转换为0:

$id = (int) $row['id'];
$x = ($row['x'] == "") ? 0 : $row['x'];
$y = ($row['y'] == "") ? 0 : $row['y'];

3) 使用POINT()更新数据:

UPDATE location SET coords = POINT( ".$x." , ".$y." ) WHERE id = ".$id

4) 如果您使用的是MySQL 5.1.35或更高版本,请考虑将插入代码更改为使用POINT(),而不使用任何GeomFrom函数(GeomFromWKB/GeomFromText)。

在那之后,你的备份应该是好的。

相关内容

  • 没有找到相关文章

最新更新