Pg field type: примеры (PHP)

Использование pg_field_type для определения типов полей в PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_field_type(PgSql\Result $result, int $field): string

Основные сведения о функции pg_field_type

Назначение и применение

Функция pg_field_type в PHP предназначена для определения типа данных конкретного поля в результате запроса к базе данных PostgreSQL. Она возвращает строку, содержащую имя типа PostgreSQL (например, 'int4', 'varchar', 'date'). Эта функция часто используется при динамической обработке результатов запросов, когда структура таблицы неизвестна заранее или требуется валидация типов данных.

Аргументы функции

Функция принимает два параметра:

  1. $result (ресурс) — обязательный параметр, представляющий результат запроса, возвращенный функциями pg_query, pg_query_params или pg_send_query.
  2. $field_number (целое число) — обязательный параметр, указывающий порядковый номер поля в результате. Нумерация начинается с 0.

Простые примеры использования

Определение типа одного поля

Базовый пример получения типа данных для первого поля в результате запроса.

<?
$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT id, username FROM users');
$fieldType = pg_field_type($result, 0);
echo $fieldType;
?>
int4
Получение типов всех полей

Пример перебора всех полей результата для вывода их типов.

<?
$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT id, email, created_at FROM users');
$fieldCount = pg_num_fields($result);
for ($i = 0; $i < $fieldCount; $i++) {
    echo pg_field_name($result, $i) . ': ' . pg_field_type($result, $i) . "\n";
}
?>
id: int4
email: varchar
created_at: timestamp

Аналогичные функции в PHP

Функция pg_field_type_oid возвращает идентификатор типа (OID) поля вместо его имени. Используется, когда необходима точная идентификация типа через системные каталоги PostgreSQL.

Функция pg_field_name предоставляет имя поля по его номеру. Часто применяется совместно с pg_field_type для полного описания структуры результата.

Функция pg_field_size возвращает внутренний размер хранилища поля. Полезно при оптимизации запросов и анализе использования памяти.

Аналоги в других языках и системах

Python (psycopg2)

В библиотеке psycopg2 тип поля можно получить через свойство cursor.description.

import psycopg2
conn = psycopg2.connect('dbname=test')
cur = conn.cursor()
cur.execute('SELECT id, name FROM users')
print(cur.description[0].type_code)  # Получение кода типа
23  # Код типа integer
JavaScript (node-postgres)

В node-postgres информация о типах доступна через свойство fields результата запроса.

const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT id FROM users');
console.log(res.fields[0].dataTypeID);
23

Pg field type в MySQL

В MySQL аналогом является функция mysql_fetch_field.

$conn = mysqli_connect('localhost', 'user', 'pass', 'test');
$result = mysqli_query($conn, 'SELECT id FROM users');
$field = mysqli_fetch_field($result);
echo $field->type;
3  (MYSQLI_TYPE_LONG)

Распространенные ошибки

Некорректный номер поля

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

<?
$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT id FROM users');
$type = pg_field_type($result, 5);
?>
Warning: pg_field_type(): Field number is out of range
Использование неверного ресурса

Попытка использования ресурса, не связанного с результатом запроса.

<?
$conn = pg_connect('dbname=test');
$type = pg_field_type($conn, 0);
?>
Warning: pg_field_type() expects parameter 1 to be resource, resource given

Изменения в версиях PHP

В PHP 8.0 функция pg_field_type была изменена для строгой типизации параметров. Аргумент $field_number теперь должен быть целым числом (int). В PHP 8.1 функция возвращает более точные имена типов для некоторых специализированных типов данных PostgreSQL, таких как массивы и пользовательские типы.

Расширенные примеры применения

Обработка пользовательских типов

Функция корректно определяет пользовательские типы данных, созданные в PostgreSQL.

Пример php
<?
$conn = pg_connect('dbname=test');
pg_query($conn, 'CREATE TYPE mood AS ENUM (''sad'', ''ok'', ''happy'')');
$result = pg_query($conn, 'CREATE TABLE person (current_mood mood)');
$result = pg_query($conn, 'SELECT current_mood FROM person');
echo pg_field_type($result, 0);
?>
mood
Определение массивов

Для полей-массивов функция возвращает базовый тип с суффиксом '[]'.

Пример php
<?
$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT ARRAY[1,2,3] as numbers');
echo pg_field_type($result, 0);
?>
int4[]
Использование с pg_field_type_oid

Совместное применение с функцией получения OID для точной идентификации.

Пример php
<?
$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT id, name FROM users');
for ($i = 0; $i < pg_num_fields($result); $i++) {
    $name = pg_field_name($result, $i);
    $type = pg_field_type($result, $i);
    $oid = pg_field_type_oid($result, $i);
    echo "$name: $type (OID: $oid)\n";
}
?>
id: int4 (OID: 23)
name: varchar (OID: 1043)

PHP pg_field_type function comments

En
Pg field type Returns the type name for the corresponding field number