Pg field size: примеры (PHP)
pg_field_size(PgSql\Result $result, int $field): intФункция pg_field_size в PHP предназначена для получения внутреннего размера указанного поля в байтах. Она используется при работе с базами данных PostgreSQL через расширение pgsql, когда требуется информация о размере хранилища данных в конкретной колонке результата запроса.
Функция применяется в ситуациях анализа структуры данных, оптимизации запросов или валидации информации перед обработкой.
- $result (ресурс) — обязательный параметр, представляющий результат запроса, возвращенный функциями
pg_query,pg_query_paramsилиpg_execute. - $field (int) — обязательный параметр, задающий порядковый номер поля в результате запроса. Нумерация начинается с 0.
Возвращаемое значение — целое число, соответствующее размеру поля в байтах. Если передан некорректный номер поля, функция вернет false. Для полей переменной длины возвращается значение -1.
Получение размера первого поля в результате запроса.
$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)
- pg_field_type — возвращает имя типа данных указанного поля. Полезна для определения типа колонки.
- pg_field_name — получает имя поля по его номеру. Используется для идентификации колонок в результате.
- pg_field_num — возвращает номер колонки по её имени. Применяется для получения индекса поля.
- pg_field_prtlen — определяет фактическую длину печатаемого значения. Подходит для вычисления длины строковых данных.
Функцию pg_field_size предпочтительно использовать, когда требуется информация о внутреннем размере хранения данных. Для анализа типа данных удобнее pg_field_type, а для работы с именами полей — pg_field_name и pg_field_num.
В 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
В библиотеке 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 8.0, функция pg_field_size не претерпела значительных изменений в синтаксисе или поведении. Однако в PHP 8.1 были улучшены сообщения об ошибках при передаче неверных аргументов. Ранее в PHP 7.4 и ниже функция могла принимать не только номер, но и имя поля в качестве второго аргумента, но эта возможность устарела.
Скрипт выводит размеры для каждой колонки результата запроса.
$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 байт
Пример различает поля фиксированной и переменной длины для дальнейшей обработки.
$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 функция возвращает размер в соответствии с внутренним представлением.
$result = pg_query($conn, 'SELECT custom_vector FROM data');
$size = pg_field_size($result, 0);
echo 'Размер пользовательского типа: ' . $size . ' байт';Размер пользовательского типа: 16 байт