【问题标题】:How to correct "Cannot get geometry object from data you send to the GEOMETRY field" when restoring a PHPMyAdmin backup?恢复 PHPMyAdmin 备份时如何更正“无法从发送到 GEOMETRY 字段的数据中获取几何对象”?
【发布时间】:2019-06-08 01:16:47
【问题描述】:

我有一些数据库使用 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

【问题讨论】:

  • 从哪个 mysql/mariaDB 版本备份?去?备份中导致错误的 SQL 语句是什么?
  • 您好,感谢您的回复。我在上面添加了更多细节。 “来自” MariaDB 版本:10.1.37。 “至” WAMPServer 3.1.4 (10.3.9-Maria DB)。也不适用于似乎不使用 MariaDB 的 WAMPServer 3.0.8。上面是 MySQL 插入代码示例。
  • 没有导出base64二进制数据的选项吗?在我看来,这就像编码或误解问题。也许 Windows 的 0 字节有问题。
  • 有“以十六进制表示法转储二进制列”,但它在打开或关闭时不起作用。我已经重新保存了所有数据并且它有效,我将添加一个解决方案。

标签: mysql phpmyadmin database-restore


【解决方案1】:

我找到了解决此问题的方法,但最好首先找出导致问题的原因。我使用 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)。

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

【讨论】:

  • 感谢这个问题。我遇到了同样的问题,我的 CREATE table 语句将 location 字段设置为 POINT 类型,location` point DEFAULT NULL;并且插入语句将 '\0\0\0\0 \0\0\0\ÐoN\Ûu%º¿ 0žACÁI@' 作为值传递。我正在使用 mySQL Workbench v8.0
  • 可能值得检查您的存储引擎和排序规则。作为参考,我使用的是 InnoDB 和 latin1_swedish_ci。
猜你喜欢
  • 2016-03-22
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2011-08-18
  • 2023-04-02
  • 2017-08-14
相关资源
最近更新 更多