我正在阅读像这样的Postgres / PostGIS语句:
SELECT ST_AsBinary(
ST_GeomFromWKB(
E'\\001\\001\\000\\000\\000\\321\\256B\\312O\\304Q\\300\\347\\030\\220\\275\\336%E@',
4326
)
);
以上从一个众所周知的二进制文件(WKB)创建了一些东西。我没有看到引用这里的具体方法,其中字符串是单引号,在开头引号之前有一个E
。
这种格式叫什么?这有什么格式规则?例如是最终特殊的336%E@
还是只是一些二进制值?
这是Postgres9.3 / 9.4; PostGIS 2.1。
答案 0 :(得分:17)
根据PostgreSQL文档http://www.postgresql.org/docs/9.0/static/sql-syntax-lexical.html(强调我的)
PostgreSQL也接受" escape"字符串常量,它是SQL标准的扩展。 通过在开头单引号之前写下字母
E
(大写或小写)来指定转义字符串常量,例如E'foo'
。 (当跨越行继续转义字符串常量时,仅在第一个开始引号之前写入E
。)在转义字符串中,反斜杠字符(\
)开始一个类似C的反斜杠转义序列,其中反斜杠和后续字符的组合表示特殊的字节值
在字符串中使用\\
意味着它会转义转义序列,可能在.sql
文件中传输和存储时是安全的。实际传递到ST_GeomFromWKB
函数的 verbatim 字符串将是:
\001\001\000\000\000\321\256B\312O\304Q\300\347\030\220\275\336%E@
这些斜杠之间的3或4个字符的序列将由ST_GeoFromWKB
直接解释。
ST_GeoFromWKB
(http://postgis.org/docs/ST_GeomFromWKB.html)的文档声明:
ST_GeomFromWKB
函数采用几何和空间参考系统ID(SRID
)的众所周知的二进制表示,并创建适当几何类型的实例。此函数在SQL中扮演Geometry Factory的角色。这是ST_WKBToSQL
的替代名称。
不幸的是,它没有说明什么格式,确切地说,"众所周知的二进制表示"实际上是。
事实证明,字符串的内容取决于您使用的坐标系,该坐标系由SRID
参数指定。在这种情况下,4326
对应WGS84
:https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84
你需要做进一步的阅读和研究来解开这个问题。
答案 1 :(得分:6)
您看到的内容看起来不像十六进制,因为bytea
字符串文字位于escape string syntax(现在已经过时了)。
E'\\001\\001\\000\\000\\000\\321\\256B\\312O\\304Q\\300\\347\\030\\220\\275\\336%E@'
与“标准符合字符串”相同:
'\001\001\000\000\000\321\256B\312O\304Q\300\347\030\220\275\336%E@'
两者都在"escape format"中,可以在"hex format"中更有效地表示为:
'\x0101000000d1ae42ca4fc451c0e71890bdde254540'
您可以使用encode()
and decode()
将一个表单转换为另一个表单。
我已回复了您的follow-up question on gis.SE了解更多详情。