Signatur
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
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);
?>
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);
?>
// 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.