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
对应于 WGS84
:https://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 并提供了更多详细信息。
我正在阅读这样的 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, writeE
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 forST_WKBToSQL
.
不幸的是,它没有说明“well-known 二进制表示”到底是什么格式。
事实证明,字符串的内容取决于您使用的坐标系,该坐标系由 SRID
参数指定。在这种情况下 4326
对应于 WGS84
:https://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 并提供了更多详细信息。