У меня есть вид, похожий на этот
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()
также является хорошим решением.