Postgres 字符串前的“E”是啥?
Posted
技术标签:
【中文标题】Postgres 字符串前的“E”是啥?【英文标题】:What's the "E" before a Postgres string?Postgres 字符串前的“E”是什么? 【发布时间】:2016-04-21 18:15:14 【问题描述】:我正在阅读这样的 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;地理信息系统 2.1。
【问题讨论】:
【参考方案1】:根据 PostgreSQL 文档 https://www.postgresql.org/docs/9.0/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@
这些斜线之间的 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
你需要做进一步的阅读和研究来解开这个问题。
【讨论】:
非常感谢。我了解4326
SRID 部分。但不是304Q
和336%E@
。它们看起来不像***所说的十六进制:en.wikipedia.org/wiki/Well-known_text#Well-known_binary。我刚刚在 GIS.SE 上问了另一个问题:gis.stackexchange.com/questions/177075/… 关于这个。【参考方案2】:
您看到的 看起来不像十六进制,因为bytea
字符串文字 在escape string syntax 中(现在已经过时了)。
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@'
两者都在"escape format" 中,在"hex format" 中可以更有效地表示为:
'\x0101000000d1ae42ca4fc451c0e71890bdde254540'
您可以使用encode()
and decode()
将一种形式转换为另一种形式。
我已回复您的follow-up question on gis.SE 并提供了更多详细信息。
【讨论】:
以上是关于Postgres 字符串前的“E”是啥?的主要内容,如果未能解决你的问题,请参考以下文章