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 部分。但不是304Q336%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”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

字符串文字前的符号“@”是啥意思? [复制]

python中字符串前的'u'是啥意思? [复制]

C#中变量名前的@符号是啥意思? [复制]

CSS中伪元素前的“&”是啥意思?

C语言中string指令是啥?

ruby 2.1.2中的“#$e”是啥意思