Start · Sprachen · PHP · Referenz · pg_field_size

pg_field_size

Funktion

Gibt die interne Speichergröße (in Bytes) eines Feldes einer PostgreSQL-Ergebnismenge zurück.

seit PHP 4.2.0 Kategorie: db

Signatur

pg_field_size(PgSql\Result $result, int $field): int

Beschreibung

pg_field_size() liefert die interne Größe des Speichers, den ein Feld eines PostgreSQL-Abfrageergebnisses belegt. Der Rückgabewert gibt an, wie viel Bytes der PostgreSQL-Server intern für diesen Datentyp reserviert – nicht die tatsächliche Länge des gespeicherten Wertes.

Für Felder mit festem Speicherbedarf (z. B. integer mit 4 Bytes oder bigint mit 8 Bytes) gibt die Funktion die exakte Byte-Anzahl zurück. Für Felder mit variabler Länge, wie text, varchar oder bytea, wird -1 zurückgegeben, da deren Größe zur Kompilierzeit nicht feststeht.

Diese Funktion ist besonders nützlich bei der dynamischen Analyse von Tabellenstrukturen, etwa beim Erstellen von generischen Datenbankwerkzeugen, Exportfunktionen oder beim Debugging von Schema-Informationen. Sie ergänzt Funktionen wie pg_field_type() und pg_field_name().

Der Parameter field ist ein nullbasierter Index, d. h. das erste Feld hat den Index 0.

Parameter

Name Typ Default Beschreibung
$result Pflicht PgSql\Result Eine PostgreSQL-Ergebnisressource, wie sie von pg_query(), pg_query_params() oder ähnlichen Funktionen zurückgegeben wird.
$field Pflicht int Nullbasierter Index des Feldes innerhalb des Ergebnisses. Das erste Feld hat den Index 0.

Rückgabewert

Typ
int
Beschreibung
Gibt die interne Größe des Feldes in Bytes als int zurück. Bei Datentypen mit variabler Länge (z. B. text, varchar) wird -1 zurückgegeben. Bei einem Fehler wird ebenfalls false zurückgegeben.

Beispiele

Speichergröße aller Felder einer Abfrage ausgeben

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

$result = pg_query($conn, 'SELECT id, name, balance, created_at FROM accounts LIMIT 1');
if (!$result) {
    die('Abfrage fehlgeschlagen');
}

$numFields = pg_num_fields($result);
for ($i = 0; $i < $numFields; $i++) {
    $name = pg_field_name($result, $i);
    $type = pg_field_type($result, $i);
    $size = pg_field_size($result, $i);
    $sizeStr = ($size === -1) ? 'variabel' : $size . ' Byte(s)';
    echo "Feld: {$name}, Typ: {$type}, Größe: {$sizeStr}\n";
}

pg_free_result($result);
pg_close($conn);
?>
Feld: id, Typ: int4, Größe: 4 Byte(s) Feld: name, Typ: varchar, Größe: variabel Feld: balance, Typ: numeric, Größe: variabel Feld: created_at, Typ: timestamp, Größe: 8 Byte(s)

Gezielten Feldindex abfragen

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
$result = pg_query($conn, 'SELECT id, description FROM products');

// Größe des ersten Feldes (id - integer)
$sizeId = pg_field_size($result, 0);
echo "Größe von 'id': " . $sizeId . " Bytes\n"; // erwartet: 4

// Größe des zweiten Feldes (description - text)
$sizeDesc = pg_field_size($result, 1);
if ($sizeDesc === -1) {
    echo "Größe von 'description': variabel (text)\n";
} else {
    echo "Größe von 'description': " . $sizeDesc . " Bytes\n";
}

pg_free_result($result);
pg_close($conn);
?>
Größe von 'id': 4 Bytes Größe von 'description': variabel (text)

// Wichtig · Fallstricke

Rückgabe -1 bei variablen Typen: Datentypen wie text, varchar(n), bytea, json, numeric und andere variabel lange Typen liefern immer -1. Dies ist kein Fehler, sondern das erwartete Verhalten von PostgreSQL für Typen ohne feste interne Größe.

Feldindex beachten: Der Index ist nullbasiert. Ein ungültiger Index führt zu einer Warnung und gibt false zurück. Es empfiehlt sich, den Index vorab mit pg_num_fields() zu validieren.

Interne vs. tatsächliche Größe: Die Funktion gibt die interne PostgreSQL-Typgröße zurück, nicht die tatsächliche Länge des gespeicherten Wertes. Für die tatsächliche Länge eines Wertes kann pg_field_prtlen() verwendet werden.