还原 PHPMyAdmin 备份时如何更正 "Cannot get geometry object from data you send to the GEOMETRY field"?
How to correct "Cannot get geometry object from data you send to the GEOMETRY field" when restoring a PHPMyAdmin backup?
我有一些数据库使用 MySQL 中的 POINT 字段来存储几何数据。所有数据以相同的方式添加:
GeomFromText( 'POINT( lat lng )' )
除一个数据库外,所有数据库备份和恢复都没有问题。此数据库与其他数据库位于同一台服务器上,但位于单独的 CPanel 帐户中。
当我尝试恢复该数据库时,出现此错误:
"Cannot get geometry object from data you send to the GEOMETRY field"
插入语句的一个例子是:
INSERT INTO `location` (`id`, `coords` , `new_coords`) VALUES
(1, '[=12=][=12=][=12=][=12=][=12=][=12=]�a��[XJ@�˶x��', '[=12=][=12=][=12=][=12=][=12=][=12=]�8z�%XJ@g�+����' ),
(3, '[=12=][=12=][=12=][=12=][=12=][=12=]�n�w�/J@6���', '[=12=][=12=][=12=][=12=][=12=][=12=]�n�w�/J@6���' ),
(4, '[=12=][=12=][=12=][=12=][=12=][=12=]� ��@J@.����', '[=12=][=12=][=12=][=12=][=12=][=12=]� ��@J@.����');
我检查了数据,当我 运行 这个查询时,它似乎都显示有效的纬度和经度:
SELECT X( coords ) , Y( coords ) FROM location
一些记录 return 0 和 0。所以我尝试将它们更新为 NULL,但我仍然遇到同样的错误。
当我尝试在勾选或不勾选 "Dump binary columns in hexadecimal notation" 选项的情况下导出时,我也会遇到同样的错误。
是否有可能导致此问题的设置,或者只是数据中的某些内容?
如果是数据,修复方法是什么?
提前致谢:)
这是使用 PHPMyAdmin 4.8.3 从 Linux MariaDB 服务器 (10.1.37-MariaDB) 在 PHP 7.2.7 上导出并导入到 WAMPServer 3.1。 4 (10.3.9-MariaDB) 使用 PHP 7.2.10 使用 PHPMyAdmin 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 中的 POINT 字段来存储几何数据。所有数据以相同的方式添加:
GeomFromText( 'POINT( lat lng )' )
除一个数据库外,所有数据库备份和恢复都没有问题。此数据库与其他数据库位于同一台服务器上,但位于单独的 CPanel 帐户中。
当我尝试恢复该数据库时,出现此错误: "Cannot get geometry object from data you send to the GEOMETRY field"
插入语句的一个例子是:
INSERT INTO `location` (`id`, `coords` , `new_coords`) VALUES
(1, '[=12=][=12=][=12=][=12=][=12=][=12=]�a��[XJ@�˶x��', '[=12=][=12=][=12=][=12=][=12=][=12=]�8z�%XJ@g�+����' ),
(3, '[=12=][=12=][=12=][=12=][=12=][=12=]�n�w�/J@6���', '[=12=][=12=][=12=][=12=][=12=][=12=]�n�w�/J@6���' ),
(4, '[=12=][=12=][=12=][=12=][=12=][=12=]� ��@J@.����', '[=12=][=12=][=12=][=12=][=12=][=12=]� ��@J@.����');
我检查了数据,当我 运行 这个查询时,它似乎都显示有效的纬度和经度:
SELECT X( coords ) , Y( coords ) FROM location
一些记录 return 0 和 0。所以我尝试将它们更新为 NULL,但我仍然遇到同样的错误。
当我尝试在勾选或不勾选 "Dump binary columns in hexadecimal notation" 选项的情况下导出时,我也会遇到同样的错误。
是否有可能导致此问题的设置,或者只是数据中的某些内容?
如果是数据,修复方法是什么?
提前致谢:)
这是使用 PHPMyAdmin 4.8.3 从 Linux MariaDB 服务器 (10.1.37-MariaDB) 在 PHP 7.2.7 上导出并导入到 WAMPServer 3.1。 4 (10.3.9-MariaDB) 使用 PHP 7.2.10 使用 PHPMyAdmin 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)。
之后,您的备份应该没问题。