mysql - 恢复 PHPMyAdmin 备份时如何更正 "Cannot get geometry object from data you send to the GEOMETRY field"?

标签 mysql phpmyadmin database-restore

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

GeomFromText( 'POINT( lat lng )' )

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

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

插入语句的示例是:

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) 导出,并使用 PHPMyAdmin 使用 PHP 7.2.10 导入到 WAMPServer 3.1.4 (10.3.9-MariaDB) 4.8.3. 请注意,这在 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)。

之后,您的备份应该没问题。

关于mysql - 恢复 PHPMyAdmin 备份时如何更正 "Cannot get geometry object from data you send to the GEOMETRY field"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54174941/

相关文章:

SQL Server 存储过程从数据库备份文件恢复

c# - Sql Server 以编程方式从远程客户端还原/备份数据库

mysql - 如何在 TextUtils.join 之后将连接的字符串转为列表

mysql - Drupal:MySQL 选择属于特定论坛的所有帖子

mysql - 在ubuntu ec2实例中拒绝访问用户时如何重置root密码

php - 使用 SQL 转储将 500MB .db 文件导入 phpmyadmin

sql - 从 Windows Azure 中的 sFTP 服务器导入数据库

mysql - 优化 MySQL 查询,耗时将近 20 秒!

mysql - 如何在 Codeigniter 中运行多个以分号分隔的查询

php - mysql数据库auto_id在数据库中排列错误