Ошибка PostGIS из-за escape-строки?

У меня есть этот запрос Postgres / PostGIS:

UPDATE raw.geocoding SET the_geom = ST_Transform(ST_GeomFromText('POINT(((E'-96.6864379495382')::float8) ((E'32.792527154088')::float8))', 4326),3081) WHERE id=((10793455)::int4) 

Когда я запускаю его, я получаю эту ошибку:

 ERROR: syntax error at or near "')::float8) ((E'" LINE 2: ...sform(ST_GeomFromText('POINT(((E'-96.6864379495382')::float8... ^ ********** Error ********** ERROR: syntax error at or near "')::float8) ((E'" SQL state: 42601 Character: 94 

Я почесываю голову, потому что PostGIS не имеет проблемы с экранированными данными ( например ), и запрос был сгенерирован из npgsql на основе этого параметризованного запроса:

 UPDATE raw.geocoding SET the_geom = ST_Transform(ST_GeomFromText('POINT(:longitude :latitude)', 4326),3081) WHERE id=:id 

Я запускаю Postgres 9.1.5 и PostGIS 2.0.1.

Ошибка возникает из неизолированных одинарных кавычек в строке. Стандартный способ – удвоить их:

 UPDATE raw.geocoding SET the_geom = ST_Transform(ST_GeomFromText( 'POINT(((E '' -96.6864379495382 '' )::float8) ((E '' 32.792527154088 '' )::float8))', 4326),3081) WHERE id=((10793455)::int4) 

Это исправляет строковый литерал, но у вас больше ошибок.
Как @Paul намекнул в комментарии, ST_GeomFromText() ожидает геометрию WKT POINT(0 0) . Явное приведение в float8 делает его похожим на то, что вы пытаетесь ввести point() функции Postgres point() (сначала меня смутили). Упростить:

 UPDATE raw.geocoding SET the_geom = ST_Transform(ST_GeomFromText( $$POINT(96.6864379495382 32.792527154088)$$ , 4326), 3081) WHERE id = 10793455 

Также обратите внимание, как я использую котировку доллара во втором примере, чтобы избежать необходимости избегать одиночных кавычек вообще. Поскольку в строковом литерале не осталось ни одной кавычки после исправления синтаксиса, вы также можете использовать одинарные кавычки. Ваш параметризованный запрос:

 UPDATE raw.geocoding SET the_geom = ST_Transform(ST_GeomFromText( $$POINT(:longitude :latitude)$$::geometry, 4326), 3081) WHERE id = :id 

Вы можете добавить бросок в geometry чтобы он дал понять, как @Paul советует в своем комментарии. Но он работает без явного приведения.