恢复PHPMyAdmin备份时,如何纠正“无法从发送到GEOMETRY字段的数据中获取几何对象”?

时间:2019-01-14 01:55:43

标签: mysql phpmyadmin database-restore

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

GeomFromText( 'POINT( lat lng )' )

除一个数据库外,所有数据库的备份和还原都没有问题。此数据库与其他数据库位于同一服务器上,但在单独的CPanel帐户中。

当我尝试还原该数据库时,出现此错误: “无法从发送到GEOMETRY字段的数据中获取几何对象”

insert语句的示例是:

INSERT INTO `location` (`id`, `coords` , `new_coords`) VALUES
(1, '\0\0\0\0\0\0�a��[XJ@�˶x��', '\0\0\0\0\0\0�8z�%XJ@g�+����' ),
(3, '\0\0\0\0\0\0�n�w�/J@6���', '\0\0\0\0\0\0�n�w�/J@6���' ),
(4, '\0\0\0\0\0\0�  ��@J@.����', '\0\0\0\0\0\0� ��@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导入到WAMPServer 3.1.4(10.3.9-MariaDB)上4.8.3。 请注意,这在WAMPServer 3.0.8上也不起作用

1 个答案:

答案 0 :(得分:0)

我找到了一个解决办法,尽管首先找出导致问题的原因是很不错的。我使用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或更高版本,请考虑将插入代码更改为不使用任何GeomFrom函数(GeomFromWKB / GeomFromText)使用POINT()。

在那之后,您的备份应该没事了。