2016-01-16 13 views
6

Tôi đã đọc một tuyên bố Postgres/PostGIS như thế này:"E" trước chuỗi Postgres là gì?

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

Trên đây tạo ra một cái gì đó từ một Binary nổi tiếng (WKB). Tôi đã không thấy cách cụ thể của trích dẫn ở đây, nơi chuỗi được trích dẫn duy nhất với một E trước báo giá bắt đầu.

Định dạng này được gọi là gì? Và các quy tắc định dạng cho điều này là gì? ví dụ. là 336%[email protected] ở cuối cùng đặc biệt hay chỉ một số giá trị nhị phân?

Đây là với Postgres9.3/9.4; PostGIS 2.1.

Trả lời

7

Theo tài liệu http://www.postgresql.org/docs/9.0/static/sql-syntax-lexical.html (tôi nhấn mạnh) PostgreSQL

PostgreSQL cũng chấp nhận "thoát" hằng chuỗi, mà là một mở rộng của tiêu chuẩn SQL. Hằng số chuỗi thoát được xác định bằng cách viết chữ cái E (chữ hoa hoặc chữ thường) ngay trước dấu ngoặc đơn mở, ví dụ: E'foo '. (Khi tiếp tục chuỗi ký tự thoát trên các dòng, chỉ viết E trước dấu mở đầu tiên.) Trong chuỗi thoát, ký tự dấu chéo ngược() bắt đầu chuỗi thoát ngược dấu gạch chéo ngược C, trong đó kết hợp dấu gạch chéo ngược và ký tự sau) đại diện cho một giá trị byte đặc biệt

Việc sử dụng \\ trong chuỗi của bạn có nghĩa là nó thoát một dãy thoát, có lẽ là để được an toàn trong vận chuyển và lưu trữ trong một tập tin .sql. Chuỗi đúng nguyên văn thực sự thông qua vào ST_GeomFromWKB chức năng sẽ là:

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

Những chuỗi 3 hoặc 4 ký tự giữa dấu gạch chéo sau đó sẽ được giải thích bởi ST_GeoFromWKB trực tiếp.

Các tài liệu cho ST_GeoFromWKB (http://postgis.org/docs/ST_GeomFromWKB.html) khẳng định:

Chức năng ST_GeomFromWKB, mất một đại diện nhị phân nổi tiếng của một hình học và một hệ thống tham chiếu không gian ID (SRID) và tạo ra một thể hiện của hình học thích hợp kiểu. Chức năng này đóng vai trò của Nhà máy Hình học trong SQL. Đây là tên thay thế cho ST_WKBToSQL.

Thật không may, nó không nêu rõ định dạng, chính xác, "đại diện nhị phân nổi tiếng" thực sự là.

Nó chỉ ra rằng nội dung của chuỗi phụ thuộc vào hệ tọa độ bạn đang sử dụng, được chỉ định bởi tham số SRID. Trong trường hợp này 4326 tương ứng với WGS84: https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84

Bạn sẽ cần đọc thêm và nghiên cứu để gỡ rối điều đó.

+0

Cảm ơn rất nhiều. Tôi hiểu phần SRID '4326'. Nhưng không phải '304Q' và' 336% E @ '. Họ không có vẻ như hexidecimals như wikipedia nói: https://en.wikipedia.org/wiki/Well-known_text#Well-known_binary. Tôi vừa hỏi một câu hỏi khác tại GIS.SE: http://gis.stackexchange.com/questions/177075/how-to-interpret-a-wkb-well-known-binary về điều này. – tinlyx

2

Những gì bạn nhìn thấy không giống như hệ thập lục phân, bởi vì byteachuỗi chữ là trong escape string syntax (đó là khá lạc hậu hiện nay).

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

Giống như "chuỗi tiêu chuẩn Tuân thủ":

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

Cả hai đều trong "escape format", có thể được thể hiện một cách hiệu quả hơn trong "hex format" như:

'\x0101000000d1ae42ca4fc451c0e71890bdde254540' 

Bạn có thể sử dụng encode() and decode() để chuyển đổi một hình thức thành hình thức khác.

Tôi đã trả lời follow-up question on gis.SE của bạn để biết thêm chi tiết.

Các vấn đề liên quan