Postgres字符串之前的“E”是什么?

时间:2016-01-16 03:17:14

标签: postgresql postgis string-literals wkb

我正在阅读像这样的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。

2 个答案:

答案 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_GeoFromWKBhttp://postgis.org/docs/ST_GeomFromWKB.html)的文档声明:

  

ST_GeomFromWKB函数采用几何和空间参考系统ID(SRID)的众所周知的二进制表示,并创建适当几何类型的实例。此函数在SQL中扮演Geometry Factory的角色。这是ST_WKBToSQL的替代名称。

不幸的是,它没有说明什么格式,确切地说,"众所周知的二进制表示"实际上是。

事实证明,字符串的内容取决于您使用的坐标系,该坐标系由SRID参数指定。在这种情况下,4326对应WGS84https://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了解更多详情。