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

tin*_*lyx 18 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
  )
);
Run Code Online (Sandbox Code Playgroud)

上面从一个众所周知的二进制文件(WKB)创建了一些东西.我没有看到这里引用的具体方法,其中字符串是单引号,E前面是引号.

这种格式叫什么?这有什么格式规则?例如,336%E@在最后特殊或只是一些二进制值?

这是Postgres9.3/9.4; PostGIS 2.1.

Dai*_*Dai 19

根据PostgreSQL文档http://www.postgresql.org/docs/9.0/static/sql-syntax-lexical.html(强调我的)

PostgreSQL还接受"转义"字符串常量,它是SQL标准的扩展.通过E在开始单引号之前写入字母(大写或小写)来指定转义字符串常量,例如E'foo'.(当在行中继续转义字符串常量时,E仅在第一个开始引号之前写入.)在转义字符串中,反斜杠字符(\)开始一个类似C的反斜杠转义序列,其中反斜杠和后续字符的组合表示特殊的字节值

使用的\\字符串中的意思是它逃避转义序列,大概是在一个运输和储存安全.sql文件.实际传入函数的逐字字符串ST_GeomFromWKB将是:

\001\001\000\000\000\321\256B\312O\304Q\300\347\030\220\275\336%E@
Run Code Online (Sandbox Code Playgroud)

然后,ST_GeoFromWKB直接解释斜杠之间的3或4个字符的这些序列.

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

你需要做进一步的阅读和研究来解开这个问题.


Erw*_*ter 6

看到的看起来不像十六进制,因为字符串文字转义字符串语法(现在已经过时了).bytea

E'\\001\\001\\000\\000\\000\\321\\256B\\312O\\304Q\\300\\347\\030\\220\\275\\336%E@'
Run Code Online (Sandbox Code Playgroud)

与"标准符合字符串"相同:

'\001\001\000\000\000\321\256B\312O\304Q\300\347\030\220\275\336%E@'
Run Code Online (Sandbox Code Playgroud)

两者都是"转义格式",可以用"十六进制格式"更有效地表示为:

'\x0101000000d1ae42ca4fc451c0e71890bdde254540'
Run Code Online (Sandbox Code Playgroud)

您可以使用encode()decode()将一个表单转换为另一个表单.

在gis.SE上回答了你的后续问题.