Я хотел бы сохранить некоторые геометрические позиции в моей базе данных MySQL. Для этого я использую тип данных POINT. Почти везде я читал, что эту функцию GeomFromText
следует использовать для вставки данных в таблицу.
Однако я узнал, что это POINT(X,Y)
тоже работает. Я не нашел описания, почему GeomFromText
следует использовать вместо POINT
.
Например, у меня есть следующее простое отношение:
CREATE TABLE Site (
SiteID BIGINT UNSIGNED,
Position POINT
);
И я могу вставить значения, используя следующие два варианта:
INSERT INTO Site (
1,
GeomFromText( 'POINT(48.19976 16.45572)' )
);
INSERT INTO Site (
2,
POINT(48.19976, 16.45572)
);
Когда я просматриваю таблицу ( SELECT * FROM Site
), я вижу тот же двоичный объект для местоположения, и когда я просматриваю координаты ( SELECT *, AsText(Position) FROM Site
), я также вижу те же значения.
Так зачем использовать GeomFromText? Есть ли (известные) различия в производительности между этими двумя вариантами? Как это решается в других системах баз данных, чем MySQL?
источник
INSERT INTO Site (Position) SELECT POINT(latitude, longitude) FROM tmp
проще, чем...SELECT GeomFromText(CONCAT('POINT(',latitude,' ',longitude,')' )) ...
Ответы:
Существует два разных двоичных формата, связанных с пространственными расширениями MySQL, «хорошо известный двоичный» (WKB) формат из стандартов и внутренний
GEOMETRY
тип данных MySQL .До MySQL 5.1.35 функции вроде
POINT()
не возвращали внутренний тип данных MySQL; они вернули WKB ... поэтому до этого вы должны были сделать это:Но теперь, как в вашем примере, это работает:
К чести разработчиков, когда они меняли
Point()
и аналогичные функции (более разумно) возвращалиGEOMETRY
объекты, они позволялиGeomFromWKB()
и аналогичным функциям фактически принимать либо данные WKB, либо MySQL Geometry в качестве входных данных, даже если функции предназначены для приема WKB в качестве входных данных.Тот факт, что 1-й метод работает (несмотря на техническую ошибку) на более новых серверах, а 2-й метод вообще не работает до MySQL 5.1.35, может объяснить, почему примеры были написаны с использованием подхода, который вы видели - полностью избежать проблемы. В противном случае ... у меня ничего нет, здесь.
Конкатенация и последующий синтаксический анализ текста кажутся интуитивно медленнее и более подвержены ошибкам, чем функции, которые принимают правильные переменные в качестве входных данных, поэтому я не могу думать о какой-либо причине для создания сцепленных строк и использования текстовых функций.
http://dev.mysql.com/doc/refman/5.1/en/creating-spatial-values.html#gis-wkb-functions
http://dev.mysql.com/doc/relnotes/mysql/5.1/en/news-5-1-35.html
источник
ST_GeomFromText()
и аналогичных функций преобразования, а не требовать от внешних приложений использования собственных функций SQL, которые создают объекты геометрии, которые находятся в Справочнике по пространственным функциям . Документы могут быть организованы лучше.MySQL 8+
Для потомков единственное, что имеет значение, это
Point(X,Y)
является конструктором для чисел с точностью и не требует преобразования сначала в текст, что делает его быстрее. Также гарантированно ВОЗВРАТИТЬPOINT
ИЛИ ОШИБКУ . Это делает его строго типизированным, если вы хотите так думать об этом.ST_
префикса; где доступно, используйте версию сST_
префиксом. Используйте WKT-конструкторы только в том случае, если ваш вводный текст уже известен. Если нет, используйтеPoint(x,y)
конструктор выше.ST_GeomFromText(wkt, srid)
может возвращать ЛЮБОЙ пространственный тип, который поддерживается MySQL и может быть представлен WKT. Это делает его свободно набранным, если вы хотите думать об этом так.ST_PointFromText(wkt, srid)
строго типизированный конструкторPOINT
из общеизвестного текста.ясность
Пропустив урок истории, НИКОГДА не делайте
GeomFromText(Point(x,y))
. Это ужасно, без поддержки и без документов.источник
С помощью GeomFromText или любой другой функции * FromText вы можете указать SRID . Я не думаю, что вы можете сделать это иначе.
источник
POINT(lng lat)
вместоPOINT(lat lng)