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

Работа с pg_field_size: получение размера поля PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_field_size(PgSql\Result $result, int $field): int
Описание функции pg_field_size

Функция pg_field_size в PHP предназначена для получения внутреннего размера указанного поля в байтах. Она используется при работе с базами данных PostgreSQL через расширение pgsql, когда требуется информация о размере хранилища данных в конкретной колонке результата запроса.

Функция применяется в ситуациях анализа структуры данных, оптимизации запросов или валидации информации перед обработкой.

Аргументы функции
  • $result (ресурс) — обязательный параметр, представляющий результат запроса, возвращенный функциями pg_query, pg_query_params или pg_execute.
  • $field (int) — обязательный параметр, задающий порядковый номер поля в результате запроса. Нумерация начинается с 0.

Возвращаемое значение — целое число, соответствующее размеру поля в байтах. Если передан некорректный номер поля, функция вернет false. Для полей переменной длины возвращается значение -1.

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

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

$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT id, name FROM products');
$size = pg_field_size($result, 0);
echo $size;
4
Проверка поля переменной длины

Для текстового поля типа VARCHAR функция возвращает -1.

$result = pg_query($conn, 'SELECT description FROM products');
$size = pg_field_size($result, 0);
var_dump($size);
int(-1)
Обработка несуществующего поля
$result = pg_query($conn, 'SELECT id FROM products');
$size = pg_field_size($result, 5);
var_dump($size);
bool(false)
Похожие функции в PHP
  • pg_field_type — возвращает имя типа данных указанного поля. Полезна для определения типа колонки.
  • pg_field_name — получает имя поля по его номеру. Используется для идентификации колонок в результате.
  • pg_field_num — возвращает номер колонки по её имени. Применяется для получения индекса поля.
  • pg_field_prtlen — определяет фактическую длину печатаемого значения. Подходит для вычисления длины строковых данных.

Функцию pg_field_size предпочтительно использовать, когда требуется информация о внутреннем размере хранения данных. Для анализа типа данных удобнее pg_field_type, а для работы с именами полей — pg_field_name и pg_field_num.

Аналоги в других языках
Python (psycopg2)

В psycopg2 информация о размере поля доступна через атрибут internal_size объекта cursor.description.

import psycopg2
conn = psycopg2.connect('dbname=test')
cursor = conn.cursor()
cursor.execute('SELECT id, name FROM products')
print(cursor.description[0].internal_size)
4
JavaScript (Node.js, pg)

В библиотеке pg метаданные о полях содержатся в свойстве fields результата запроса, но прямого аналога pg_field_size нет. Размер можно получить через описание типов.

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

Pg field size в MySQL

В MySQL для получения размера столбца в байтах используется оператор CHARACTER_OCTET_LENGTH из INFORMATION_SCHEMA.COLUMNS.

SELECT CHARACTER_OCTET_LENGTH 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='products' AND COLUMN_NAME='id';
4
Типичные ошибки
Передача неверного номера поля

Если указать индекс, превышающий количество полей, функция вернет false.

$result = pg_query($conn, 'SELECT id FROM products');
$size = pg_field_size($result, 1);
if ($size === false) {
    echo 'Ошибка: неверный номер поля';
}
Ошибка: неверный номер поля
Использование недействительного ресурса

Передача некорректного ресурса результата приводит к предупреждению и возврату false.

$size = pg_field_size(null, 0);
var_dump($size);
Warning: pg_field_size() expects parameter 1 to be resource, null given
bool(false)
Недоступное соединение с базой данных

Если соединение с PostgreSQL разорвано, функция может не вернуть корректный результат.

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

Начиная с PHP 8.0, функция pg_field_size не претерпела значительных изменений в синтаксисе или поведении. Однако в PHP 8.1 были улучшены сообщения об ошибках при передаче неверных аргументов. Ранее в PHP 7.4 и ниже функция могла принимать не только номер, но и имя поля в качестве второго аргумента, но эта возможность устарела.

Расширенные примеры
Определение размеров всех полей в результате

Скрипт выводит размеры для каждой колонки результата запроса.

Пример php
$result = pg_query($conn, 'SELECT id, name, price FROM products');
$fieldCount = pg_num_fields($result);
for ($i = 0; $i < $fieldCount; $i++) {
    $name = pg_field_name($result, $i);
    $size = pg_field_size($result, $i);
    echo 'Поле ' . $name . ': размер = ' . $size . ' байт
'; }
Поле id: размер = 4 байт
Поле name: размер = -1 байт
Поле price: размер = 8 байт
Анализ переменных и фиксированных размеров

Пример различает поля фиксированной и переменной длины для дальнейшей обработки.

Пример php
$sizes = [];
foreach (pg_fetch_assoc($result) as $field => $value) {
    $num = pg_field_num($result, $field);
    $size = pg_field_size($result, $num);
    $sizes[$field] = $size;
}
print_r($sizes);
Array
(
    [id] => 4
    [name] => -1
    [price] => 8
)
Использование с пользовательскими типами данных

Для пользовательских типов PostgreSQL функция возвращает размер в соответствии с внутренним представлением.

Пример php
$result = pg_query($conn, 'SELECT custom_vector FROM data');
$size = pg_field_size($result, 0);
echo 'Размер пользовательского типа: ' . $size . ' байт';
Размер пользовательского типа: 16 байт

PHP pg_field_size function comments

En
Pg field size Returns the internal storage size of the named field