Postgresql regexp_matches внутри представления всегда возвращает null при запросе из PHP

У меня есть вид, похожий на этот

CREATE OR REPLACE VIEW regexp_test AS ( SELECT regexp_matches(decode('NTB4', 'base64')::text, '(\d+)x') ) 

Когда я запрашиваю вид из pgAdmin, возвращается массив с одним значением 50, как и ожидалось.

 SELECT * FROM regexp_test 

Но когда я вызываю тот же запрос из PHP через pg_query('SELECT * FROM regexp_test') , ничего не возвращается.

postgres версия 9.5.3, версия PHP 7.0.3 (тот же результат с 5.6.14)

PHP-код очень простой:

 <?php $link = pg_connect('host=localhost port=5432 dbname=test user=postgres password=postgres'); $qry = "SELECT * FROM regexp_test"; $res = pg_query($link, $qry); while ($row = pg_fetch_row($res)) { print_r($row); } 

pg_query возвращает ресурс результата.

 $result = pg_query('SELECT * FROM regexp_test'); while ($row = pg_fetch_row($result)) { echo "$row"; } 

pg_query возвращает false при ошибке

Если возникает ошибка, и возвращается FALSE, данные об ошибке могут быть получены с помощью функции pg_last_error (), если соединение действительно.

Я понял, используя encode(decode('NTB4', 'base64'), 'escape') вместо decode('NTB4', 'base64')::text типов decode('NTB4', 'base64')::text проблема с исправлением decode('NTB4', 'base64')::text .

Итак, теперь тестовое представление выглядит следующим образом:

 CREATE OR REPLACE VIEW regexp_test AS ( SELECT regexp_matches(encode(decode('NTB4', 'base64'), 'escape'), '(\d+)x') ) 

Вызов pg_query('SELECT * FROM regexp_test') теперь возвращает ожидаемый результат – однострочное / поле с '{50}' в нем.

Тот же запрос

 select e'\\x353078'::bytea; 

дает результаты в разных форматах в psql :

  bytea ---------- \x353078 

и в PgAdmin III :

  bytea ---------- 50x 

Для документации:

Тип bytea поддерживает два внешних формата ввода и вывода: исторический формат «выхода» PostgreSQL и формат «hex». Оба они всегда принимаются на вход. Формат вывода зависит от параметра конфигурации bytea_output ; по умолчанию используется hex. (Обратите внимание, что шестнадцатеричный формат был введен в PostgreSQL 9.0, более ранние версии и некоторые инструменты его не понимают).

PgAdmin III (а также PgAdmin4), вероятно, по историческим причинам устанавливает значение bytea_output для escape то время как значение по умолчанию для параметра равно hex . Это может привести к путанице (и, как вы можете видеть, это приводит). Кажется, что pgAdmin не должен изменять значение по умолчанию для параметра.

Вы можете изменить параметр в своем приложении, чтобы получить такое же поведение, как в PgAdmin:

 set bytea_output to escape; 

Конечно, использование encode() также является хорошим решением.