36

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

4

2 回答 2

35

根据 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_GeoFromWKBhttps://postgis.net/docs/ST_GeomFromWKB.html )的文档指出:

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

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

事实证明,字符串的内容取决于您使用的坐标系,该坐标系由SRID参数指定。在这种情况下4326对应于WGS84https ://en.wikipedia.org/wiki/World_Geodetic_System#WGS84

你需要做进一步的阅读和研究来解开这个问题。

于 2016-01-16T03:19:02.533 回答
7

看到的内容看起来不像十六进制,因为字符串文字采用转义字符串语法(现在已经过时了)。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()anddecode()将一种形式转换为另一种形式。

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

于 2016-01-16T05:06:54.193 回答