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

问题描述 投票:0回答:3

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

postgresql postgis string-literals wkb
3个回答
47
投票

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

PostgreSQL 还接受“转义”字符串常量,这是 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
https://postgis.net/docs/ST_GeomFromWKB.html)的文档指出:

ST_GeomFromWKB
函数采用众所周知的几何图形二进制表示和空间参考系统ID (
SRID
),并创建适当几何类型的实例。该函数起到了SQL中几何工厂的作用。这是
ST_WKBToSQL
的替代名称。

不幸的是,它没有说明“众所周知的二进制表示形式”实际上是什么格式。

事实证明,字符串的内容取决于您使用的坐标系,该坐标系由

SRID
参数指定。在这种情况下,
4326
对应于
WGS84
https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84

您需要进一步阅读和研究才能解决这个问题。


8
投票

看到的看起来不像十六进制,因为

bytea
字符串文字采用转义字符串语法(现在已经过时了)。

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@'

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

'\x0101000000d1ae42ca4fc451c0e71890bdde254540'

您可以使用

encode()
decode()
将一种形式转换为另一种形式。

我在 gis.SE 上回答了您的后续问题,提供了更多详细信息。


0
投票

例如:

(9.1版本及之后)

select '\n'; -- \n -- literal string <=> r'\n' in py
select E'\n'; -- (a newline) -- escapable string
select '\u0024'; -- \u0024
select E'\u0024'; -- $ (a dollar sign)
select '\\u0024'; -- \\u0024
select E'\\u0024'; -- \u0024

--

警告:差异版本中的

standard_conforming_strings

如果配置参数 standard_conforming_strings

off
,则 PostgreSQL 会识别常规和转义字符串常量中的反斜杠转义。但是,从 PostgreSQL 9.1 开始,默认值为
on
,这意味着反斜杠转义仅在转义字符串常量中被识别。

https://www.postgresql.org/docs/16/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE

© www.soinside.com 2019 - 2024. All rights reserved.