2016-01-16 21 views
6

Stavo leggendo una dichiarazione Postgres/PostGIS come questo:Cos'è la "E" prima di una stringa di Postgres?

SELECT ST_AsBinary(
ST_GeomFromWKB(
    E'\\001\\001\\000\\000\\000\\321\\256B\\312O\\304Q\\300\\347\\030\\220\\275\\336%[email protected]', 
    4326 
) 
); 

È possibile che questo crea qualcosa da un WKB (WKB). Non ho visto il modo specifico di quotare qui dove la stringa è quotata singolarmente con un E precedente alla citazione iniziale.

Come si chiama questo formato? E quali sono le regole di formattazione per questo? per esempio. è lo 336%[email protected] alla fine speciale o solo un valore binario?

Questo è con Postgres9.3/9.4; PostGIS 2.1.

risposta

7

Come per la documentazione di PostgreSQL http://www.postgresql.org/docs/9.0/static/sql-syntax-lexical.html (sottolineatura mia)

PostgreSQL accetta anche "fuga" costanti di stringa, che sono un'estensione dello standard SQL. Una costante di stringa di escape viene specificata scrivendo la lettera E (maiuscole o minuscole) subito prima dell'opzione singola di apertura, ad esempio E'foo '. (Quando si continua una costante di stringa di escape attraverso le righe, scrivere E solo prima della citazione iniziale.) All'interno di una stringa di escape, un carattere barra rovesciata() inizia una sequenza di escape backslash simile a C, in cui la combinazione di backslash e dei seguenti caratteri) rappresentano un valore speciale di byte

L'uso di \\ nella stringa significa che è in fuga una sequenza di escape, probabilmente per essere sicuri in transito e stoccaggio in un file .sql. La stringa testualmente effettivamente trasmessa alla funzione ST_GeomFromWKB sarà:

\001\001\000\000\000\321\256B\312O\304Q\300\347\030\220\275\336%[email protected] 

Queste sequenze di 3 o 4 caratteri tra barre sarebbero poi essere interpretati da ST_GeoFromWKB direttamente.

La documentazione per ST_GeoFromWKB (http://postgis.org/docs/ST_GeomFromWKB.html) afferma:

La funzione ST_GeomFromWKB, rileva una rappresentazione WKB di una geometria e un sistema di riferimento spaziale ID (SRID) e crea un'istanza della geometria appropriata genere. Questa funzione svolge il ruolo di Geometry Factory in SQL. Questo è un nome alternativo per ST_WKBToSQL.

Sfortunatamente non indica quale formato, in realtà, sia la "ben nota rappresentazione binaria".

Si scopre che il contenuto della stringa dipende dal sistema di coordinate che si sta utilizzando, che è specificato dal parametro SRID. In questo caso 4326 corrisponde a WGS84: https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84

Avrai bisogno di fare ulteriori letture e ricerche per districarlo.

+0

Grazie mille. Capisco la parte SRID '4326'. Ma non '304Q', e' 336% E @ '. Non sembrano esidecimali come dice wikipedia: https://en.wikipedia.org/wiki/Well-known_text#Well-known_binary. Ho appena fatto un'altra domanda su GIS.SE: http://gis.stackexchange.com/questions/177075/how-to-interpret-a-wkb-well-known-binary a riguardo. – tinlyx

2

Quello che si vede non assomiglia esadecimale, perché la stringa bytealetterale è in escape string syntax (che è piuttosto obsoleto al giorno d'oggi).

E'\\001\\001\\000\\000\\000\\321\\256B\\312O\\304Q\\300\\347\\030\\220\\275\\336%[email protected]' 

lo stesso di "stringa standard conforme":

'\001\001\000\000\000\321\256B\312O\304Q\300\347\030\220\275\336%[email protected]' 

Entrambi sono in "escape format", che può essere rappresentato in modo più efficiente in "hex format" come:

'\x0101000000d1ae42ca4fc451c0e71890bdde254540' 

È possibile utilizzare encode() and decode() per trasforma una forma nell'altra.

Ho risposto al tuo follow-up question on gis.SE con ulteriori dettagli.