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

What's the "E" before a Postgres string?

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

以上代码从 Well Known Binary (WKB) 创建了一些东西。我还没有看到这里的具体引用方式,其中字符串在开始引号之前用 E 单引号引起来。

这种格式叫什么?这个的格式规则是什么?例如最后的 336%E@ 是特殊值还是一些二进制值?

这是Postgres9.3/9.4; PostGIS 2.1.

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

PostgreSQL also accepts "escape" string constants, which are an extension to the SQL standard. An escape string constant is specified by writing the letter E (upper or lower case) just before the opening single quote, e.g., E'foo'. (When continuing an escape string constant across lines, write E only before the first opening quote.) Within an escape string, a backslash character (\) begins a C-like backslash escape sequence, in which the combination of backslash and following character(s) represent a special byte value

在您的字符串中使用 \ 意味着它正在转义转义序列,可能是为了安全地传输和存储在 .sql 文件中。 verbatim 字符串实际传递给 ST_GeomFromWKB 函数将是:

[=10=]1[=10=]1[=10=]0[=10=]0[=10=]016B2O4Q070056%E@

斜杠之间的这些 3 或 4 个字符的序列将由 ST_GeoFromWKB 直接解释。

ST_GeoFromWKB ( https://postgis.net/docs/ST_GeomFromWKB.html ) 的文档指出:

The ST_GeomFromWKB function, takes a well-known binary representation of a geometry and a Spatial Reference System ID (SRID) and creates an instance of the appropriate geometry type. This function plays the role of the Geometry Factory in SQL. This is an alternate name for ST_WKBToSQL.

不幸的是,它没有说明“well-known 二进制表示”到底是什么格式。

事实证明,字符串的内容取决于您使用的坐标系,该坐标系由 SRID 参数指定。在这种情况下 4326 对应于 WGS84https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84

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

看到的看起来不像十六进制,因为bytea string literal is in escape string syntax(现在已经过时了)。

E'\001\001\000\000\000\321\256B\312O\304Q\300\347\030\220\275\336%E@'

与"standard conforming string"相同:

'[=11=]1[=11=]1[=11=]0[=11=]0[=11=]016B2O4Q070056%E@'

两者都在 "escape format", which can be represented more efficiently in "hex format" 中:

'\x0101000000d1ae42ca4fc451c0e71890bdde254540'

您可以使用 encode() and decode() 将一种形式转换为另一种形式。

我回答了你的 follow-up question on gis.SE 并提供了更多详细信息。