Как исправить "Не удается получить объект геометрии из данных, отправляемых в поле 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 или более позднюю версию.
После этого ваша резервная копия должна быть в порядке.