我正在阅读这样的 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 文档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)的文档指出:
函数采用众所周知的几何图形二进制表示和空间参考系统ID (ST_GeomFromWKB
),并创建适当几何类型的实例。该函数起到了SQL中几何工厂的作用。这是SRID
的替代名称。ST_WKBToSQL
不幸的是,它没有说明“众所周知的二进制表示形式”实际上是什么格式。
事实证明,字符串的内容取决于您使用的坐标系,该坐标系由
SRID
参数指定。在这种情况下,4326
对应于WGS84
:https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84
您需要进一步阅读和研究才能解决这个问题。
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 上回答了您的后续问题,提供了更多详细信息。
例如:
(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 为
,则 PostgreSQL 会识别常规和转义字符串常量中的反斜杠转义。但是,从 PostgreSQL 9.1 开始,默认值为off
,这意味着反斜杠转义仅在转义字符串常量中被识别。on
https://www.postgresql.org/docs/16/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE