Как исправить "Не удается получить объект геометрии из данных, отправляемых в поле GEOMETRY" при восстановлении резервной копии PHPMyAdmin?

У меня есть несколько баз данных, которые используют поля POINT в MySQL для хранения данных геометрии. Все данные добавляются одинаково:

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, и я все еще получаю ту же ошибку.

Когда я пытаюсь выполнить экспорт с галочкой или без опции "Дамп двоичных столбцов в шестнадцатеричном формате", я также получаю ту же ошибку.

Есть ли параметр, который может вызвать эту проблему, или это просто будет что-то в данных?

Если это данные, что бы исправить?

Заранее спасибо:)

Это экспорт с сервера Linux MariaDB (10.1.37-MariaDB) на PHP 7.2.7 с использованием PHPMyAdmin 4.8.3 и импорт на WAMPServer 3.1.4 (10.3.9-MariaDB) с использованием PHP 7.2.10 с использованием PHPMyAdmin 4.8.3, Обратите внимание, это также не работает на WAMPServer 3.0.8

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) Рассмотрите возможность изменения кода вставки для использования POINT() без каких-либо функций GeomFrom (GeomFromWKB/GeomFromText), если вы используете MySQL 5.1.35 или более позднюю версию.

После этого ваша резервная копия должна быть в порядке.

Другие вопросы по тегам