Eu gostaria de armazenar algumas posições geométricas no meu banco de dados MySQL. Para isso eu uso o tipo de dados POINT. Em quase todos os lugares li que a função GeomFromText
deve ser usada para inserir dados na tabela.
No entanto, descobri que POINT(X,Y)
também funciona. Não encontrei nenhuma descrição por que GeomFromText
deveria ser usado em vez de POINT
.
Por exemplo, tenho a seguinte relação simples:
CREATE TABLE Site (
SiteID BIGINT UNSIGNED,
Position POINT
);
E posso inserir valores usando as duas variantes a seguir:
INSERT INTO Site (
1,
GeomFromText( 'POINT(48.19976 16.45572)' )
);
INSERT INTO Site (
2,
POINT(48.19976, 16.45572)
);
Quando visualizo a tabela ( SELECT * FROM Site
) vejo o mesmo blob binário para o local e quando vejo as coordenadas ( SELECT *, AsText(Position) FROM Site
) também vejo os mesmos valores.
Então, por que GeomFromText deve ser usado? Existem diferenças de desempenho (conhecidas) entre essas duas variantes? Como isso é resolvido em outros sistemas de banco de dados além do MySQL?
Existem dois formatos binários diferentes relacionados às extensões espaciais do MySQL, o formato "binário bem conhecido" (WKB) dos padrões e o
GEOMETRY
tipo de dados interno do MySQL.Antes do MySQL 5.1.35, funções como
POINT()
não retornavam o tipo de dados interno do MySQL; eles retornaram WKB ... então antes disso, você tinha que fazer isso:Mas agora, como no seu exemplo, isso funciona:
Para crédito dos desenvolvedores, quando eles mudaram
Point()
e funções semelhantes para (mais sensatamente) retornarGEOMETRY
objetos, eles permitiram queGeomFromWKB()
funções semelhantes realmente aceitassem dados WKB ou MySQL Geometry como entrada, embora as funções tenham a intenção de aceitar WKB como entrada.O fato de o primeiro método funcionar (apesar de estar tecnicamente errado) em servidores mais novos e o segundo método não funcionar antes do MySQL 5.1.35 pode explicar por que os exemplos foram escritos usando a abordagem que você viu -- para evitar totalmente o problema. Caso contrário... não tenho nada aqui.
Concatenar e depois analisar texto parece intuitivamente mais lento e mais propenso a erros do que funções que aceitam variáveis apropriadas como entrada, então não consigo pensar em nenhum motivo para criar strings concatenadas e usar as funções baseadas em texto.
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
MySQL 8+
Para a posteridade, a única coisa que importa é que
Point(X,Y)
é um construtor de números com precisão e não requer conversão primeiro em texto, tornando-o mais rápido. Também é garantido RETURN APOINT
OR FAIL . Isso o torna fortemente tipado se você quiser pensar assim.ST_
prefixo; quando disponível, use a versão com oST_
prefixo. Use os construtores WKT somente se sua entrada já for um texto conhecido. Se não, use oPoint(x,y)
construtor acima.ST_GeomFromText(wkt, srid)
pode retornar QUALQUER tipo espacial suportado pelo MySQL e pode ser representado pelo WKT. Isso o torna vagamente digitado se você quiser pensar assim.ST_PointFromText(wkt, srid)
um -construtor fortemente tipadoPOINT
de um texto bem conhecido.Clareza
Ignorando a lição de história, NUNCA faça
GeomFromText(Point(x,y))
. Isso é horrível, sem suporte e sem documentação.Com GeomFromText ou qualquer outra função *FromText você pode especificar o SRID . Eu não acho que você pode fazer isso de outra forma.