PostgreSQL-Fehler: value too long for type character varying
ERROR: value too long for type character varying(50)
Ein String überschritt die deklarierte Längenbegrenzung seiner Spalte, und PostgreSQL wies den Schreibvorgang ab, statt ihn stillschweigend abzuschneiden. Ärgerlicherweise nennt die Meldung den Typ, aber nicht die Spalte — herauszufinden, welche Spalte, ist Schritt eins.
Was dieser Fehler bedeutet
Zwei PostgreSQL-spezifische Tatsachen rahmen die Lösung:
- Es gibt keinen Performance-Vorteil von
varchar(n)gegenübertextin PostgreSQL — sie werden identisch gespeichert. Das Limit ist rein ein Constraint, es sollte also nur dort existieren, wo das Geschäft tatsächlich eines hat. - Das Verbreitern eines varchar schreibt die Tabelle nicht neu — das Erhöhen des Limits ist eine schnelle, rein katalogseitige Änderung.
Häufige Ursachen
- Echte Daten überwuchsen ein willkürliches Limit — das Cargo-Cult-
varchar(255), das auf eine lange URL, einen User-Agent oder eine Adresse trifft. - Verkettung oder denormalisierte Felder, die über die ursprüngliche Schätzung hinauswachsen.
- Importe mit falschem Spalten-Mapping, die lange Werte in kurze Felder legen.
So diagnostizieren Sie ihn
-- Welche varchar(50)-Spalten die verdächtige Tabelle hat:
SELECT column_name, character_maximum_length
FROM information_schema.columns
WHERE table_name = 'users' AND character_maximum_length IS NOT NULL;
Vergleichen Sie dann mit der fehlgeschlagenen Payload. Wenn die Anweisung protokolliert ist, stehen die Werte direkt da.
So beheben Sie ihn
- Verbreitern Sie es (schnell, rein katalogseitig):
ALTER TABLE users ALTER COLUMN name TYPE varchar(200); - Oder entfernen Sie das willkürliche Limit ganz —
text, mit einem CHECK-Constraint, falls eine Grenze wirklich wichtig ist:
Ein CHECK ist später leichter anzupassen als ein Typ.ALTER TABLE users ALTER COLUMN name TYPE text; ALTER TABLE users ADD CONSTRAINT name_reasonable CHECK (length(name) <= 1000); - Schneiden Sie clientseitig nur ab, wenn das Abschneiden wirklich akzeptabel ist (
left(value, 50)) — das ist eine Produktentscheidung, kein Datenbank-Default, was genau der Grund ist, warum PostgreSQL sich weigert, sie für Sie zu treffen.
