web-dev-qa-db-ja.com

Postgres文字列の前の「E」は何ですか?

私はこのような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。

20
tinlyx

PostgreSQLのドキュメントに従って http://www.postgresql.org/docs/9.0/static/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_GeoFromWKBhttp://postgis.org/docs/ST_GeomFromWKB.html )のドキュメントには次のように記載されています:

ST_GeomFromWKB関数は、ジオメトリの既知のバイナリ表現と空間参照システムID(SRID)を取り、適切なジオメトリタイプのインスタンスを作成します。この関数は、SQLのジオメトリファクトリの役割を果たします。これはST_WKBToSQLの別名です。

残念ながら、実際には「よく知られているバイナリ表現」がどのような形式であるかは明記されていません。

文字列の内容は、SRIDパラメータで指定されている使用している座標系に依存することがわかります。この場合、4326WGS84に対応します: https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84

それを解くには、さらに読み、調査する必要があります。

18
Dai

seeは16進数のようには見えません。なぜなら、 byteastring literalエスケープ文字列構文 にあります(最近ではかなり古くなっています)。

_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@'
_

どちらも "エスケープ形式" であり、 "16進形式" でより効率的に表すことができます。

_'\x0101000000d1ae42ca4fc451c0e71890bdde254540'
_

encode()およびdecode() を使用して、1つのフォームを別のフォームに変換できます。

フォローアップの質問にgis.SE で詳細に回答しました。

6