Discussion:
PostgreSQL: Länge eines Varchar-Feldes
(zu alt für eine Antwort)
Frank Seitz
2004-11-28 06:54:16 UTC
Permalink
Hallo,

ich möchte die (maximale) Länge eines Varchar-Feldes ermitteln,
also bei einer Kolumnendefinition a la "x varchar(25)" den Wert 25.
Diese Information müsste ansich irgendwo hinterlegt
sein, da PostgreSQL die Einhaltung der Maximallänge bei Einfügen
überprüft. Was ich in den Systemcatalogen gefunden habe, ist in
pg_attribute und pg_type die Angabe attlen bzw. typlen.
Nur steht dort für Varchar-Felder der Wert -1. Hat jemand
einen Tip für mich, wo ich den gesuchten Wert finde?

Gruß
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Andreas Kretschmer
2004-11-28 07:21:12 UTC
Permalink
Post by Frank Seitz
Nur steht dort für Varchar-Felder der Wert -1. Hat jemand
einen Tip für mich, wo ich den gesuchten Wert finde?
Aus der deutschen Übersetzung des PostgreSQL-Handbuches:

"Wenn character varying ohne Längenangabe verwendet wird, dann
akzeptiert der Typ Zeichenketten beliebiger Länge. Letzteres ist eine
Erweiterung von PostgreSQL."


Frage beantwortet?


Außerdem gibt es noch 'text', der ebenfalls unbegrenzt ist.

end
Andreas
--
Diese Message wurde erstellt mit freundlicher Unterstützung eines freilau-
fenden Pinguins aus artgerechter Freilandhaltung. Er ist garantiert frei
von Micro$oft'schen Viren. (#97922 http://counter.li.org) GPG 7F4584DA
Was, Sie wissen nicht, wo Kaufbach ist? Hier: N 51.05082°, E 13.56889° ;-)
Frank Seitz
2004-11-28 07:42:23 UTC
Permalink
Post by Andreas Kretschmer
Post by Frank Seitz
Nur steht dort für Varchar-Felder der Wert -1. Hat jemand
einen Tip für mich, wo ich den gesuchten Wert finde?
"Wenn character varying ohne Längenangabe verwendet wird, dann
akzeptiert der Typ Zeichenketten beliebiger Länge. Letzteres ist eine
Erweiterung von PostgreSQL."
Frage beantwortet?
Nein. Denn ich verwende eine Längenangabe und würde
die gerne wiederfinden. Ihre Einhaltung wird, wie gesagt,
von PostgreSQL auch geprüft.
Post by Andreas Kretschmer
Außerdem gibt es noch 'text', der ebenfalls unbegrenzt ist.
Ok, aber das hat nichts mit meiner Frage zu tun.

Gruß
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Dieter Nöth
2004-11-28 09:09:34 UTC
Permalink
Post by Frank Seitz
ich möchte die (maximale) Länge eines Varchar-Feldes ermitteln,
also bei einer Kolumnendefinition a la "x varchar(25)" den Wert 25.
Diese Information müsste ansich irgendwo hinterlegt
sein, da PostgreSQL die Einhaltung der Maximallänge bei Einfügen
überprüft. Was ich in den Systemcatalogen gefunden habe, ist in
pg_attribute und pg_type die Angabe attlen bzw. typlen.
Nur steht dort für Varchar-Felder der Wert -1. Hat jemand
einen Tip für mich, wo ich den gesuchten Wert finde?
AFAIK kennt PostgreSQL die ANSI SQL information_schema views.
Und in information_schema.columns gibt es eine Spalte
character_maximum_length, die genau die gewünschte Info enthalten sollte.

Dieter
Gerd Nachtsheim
2004-11-28 13:08:31 UTC
Permalink
Post by Dieter Nöth
Post by Frank Seitz
ich möchte die (maximale) Länge eines Varchar-Feldes ermitteln,
also bei einer Kolumnendefinition a la "x varchar(25)" den Wert 25.
Diese Information müsste ansich irgendwo hinterlegt
sein, da PostgreSQL die Einhaltung der Maximallänge bei Einfügen
überprüft. Was ich in den Systemcatalogen gefunden habe, ist in
pg_attribute und pg_type die Angabe attlen bzw. typlen.
Nur steht dort für Varchar-Felder der Wert -1. Hat jemand
einen Tip für mich, wo ich den gesuchten Wert finde?
AFAIK kennt PostgreSQL die ANSI SQL information_schema views.
Und in information_schema.columns gibt es eine Spalte
character_maximum_length, die genau die gewünschte Info enthalten sollte.
Hab mir mal nur so aus Neugier eben die 8.0.0.beta5 installiert und
siehe da...

create table hasi(str varchar(42))
;
select col.table_name as TName,
col.column_name as CName,
col.character_maximum_length as Len
from information_schema.columns col
where col.table_name = 'hasi'
;

tname |cname|len
-------------------
"hasi"|"str"|"42"

So ein Standard ist keine schlechte Sache... ;)

Gerd
Frank Seitz
2004-11-28 18:02:08 UTC
Permalink
Post by Dieter Nöth
AFAIK kennt PostgreSQL die ANSI SQL information_schema views.
Und in information_schema.columns gibt es eine Spalte
character_maximum_length, die genau die gewünschte Info enthalten sollte.
Danke für den Tip. Es ist so, wie Du sagst.
Ich wußte nicht, dass PostgreSQL (7.4.5) diese Views besitzt.
Ich habe den betreffenden Abschnitt in der sehr guten
Doku schlicht übersehen. Bei den PostgreSQL-eigenen
Systemkatalogen findet sich leider kein Querverweis dorthin.

Gruß
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Juergen Mischke
2004-11-28 11:40:22 UTC
Permalink
Post by Frank Seitz
ich möchte die (maximale) Länge eines Varchar-Feldes ermitteln,
also bei einer Kolumnendefinition a la "x varchar(25)" den Wert 25.
Diese Information müsste ansich irgendwo hinterlegt
sein, da PostgreSQL die Einhaltung der Maximallänge bei Einfügen
überprüft. Was ich in den Systemcatalogen gefunden habe, ist in
pg_attribute und pg_type die Angabe attlen bzw. typlen.
Nur steht dort für Varchar-Felder der Wert -1. Hat jemand
einen Tip für mich, wo ich den gesuchten Wert finde?
Relativ leicht zu finden, wenn man schon mal gesucht hat. Mit :

select attname, attnum, typname, typlen , atttypmod - 4, attnotnull,
atthasdef, attisdropped
from pg_attribute, pg_type, pg_class
where atttypid = pg_type.oid and attrelid = pg_class.oid

unter attypmod-4 steht dann die korrekte Länge. (Mit dem SELECT werden dir
alle Felder deiner DB angezeigt, mit pg_class.oid (Nummer einer von dir
gewünschten Tabelle ) kannst du das ganze etwas einschränken.


Grüsse
Jürgen
Frank Seitz
2004-11-28 18:05:30 UTC
Permalink
Post by Juergen Mischke
unter attypmod-4 steht dann die korrekte Länge.
Ah ja. Das scheint auch zu funktionieren. Allerdings läßt
sich das aus der Doku nicht herauslesen und diese Differenz
von 4 verschleiert den Zusammenhang zusätzlich. Über die
Information Schema Views zu gehen, ist sicherlich
der bessere Weg, den ich auch beschreiten werde.

Gruß
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Loading...