Как исправить «Не удается получить объект геометрии из данных, отправленных в поле GEOMETRY» при восстановлении резервной копии PHPMyAdmin? - PullRequest
0 голосов
/ 14 января 2019

У меня есть несколько баз данных, которые используют поля 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 Ответ

0 голосов
/ 14 января 2019

Я нашел исправление для этого, хотя было бы неплохо сначала выяснить, что стало причиной проблемы. Я извлек данные из базы данных с помощью 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).

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

...