8.3. Karaktertyper

Tabel 8-4. Karaktertyper

Navn Beskrivelse
karakter varierende(n), varchar(n) variabel-længde med begrænsning
karakter(n), char(n) fast længde, blank padded
text variabel ubegrænset længde

Tabel8-4 viser de generelle tegntyper, der er tilgængelige iPostgreSQL.

SQL definerer to primæretegntyper: character varying(n) og character(n), hvoreren er et positivt heltal. Begge disse typer kan gemme strenge på op til n tegn (ikke bytes) i længden. Etforsøg på at gemme en længere streng i en kolonne af disse typer vil resultere i en fejl, medmindre de overskydende tegn alle er mellemrum, i hvilket tilfælde strengen vil blive afkortet til den maksimale længde (denne noget bizarre undtagelse er påkrævet i SQL-standarden).) Hvis den streng, der skal gemmes, er kortere end den angivne længde, vil værdier af typen character blive udfyldt med mellemrum; værdier af typencharactervarying vil simpelthen gemme den kortere streng.

Hvis man udtrykkeligt kaster en værdi til charactervarying(n) eller character(n), vil en værdi med overlængde blive afkortet til n tegn uden at give anledning til en fejl. (Dette er påkrævet i SQL-standarden.)

Notationerne varchar(n) og char(n) er aliaser for henholdsvis charactervarying(n)og character(n). character uden længdeangivelse svarer til character(1). Hvis der anvendes charactervarying uden længdeangivelse, accepterer typen strenge af enhver størrelse. Sidstnævnte er en PostgreSQL-udvidelse.

Dertil kommer, at PostgreSQL tilbyder teksttypen, som gemmer strings af enhver længde. Selv om typen text ikke er i SQL-standarden, har flere andre SQL-databasehåndteringssystemer den også.

Værdier af typen character er fysisk udstoppet med mellemrum til den angivne bredde n, og gemmes og vises på denne måde.Imidlertid behandles de udstoppende mellemrum som semantisk ubetydelige. Der ses bort fra mellemrum ved sammenligning af to værdier af typen karakter, og de fjernes ved konvertering af en karakterværdi til en af de andre strengtyper. Bemærk, at efterfølgende mellemrum er semantisk betydningsfulde i karaktervariationer og tekstværdier og ved brug af mønstermatchning, f.eks. ved LIKE, regulære udtryk.

Lagerbehovet for en kort streng (op til 126 byte) er 1 byte plus den faktiske streng, som omfatter mellemrumsudfyldning i tilfælde af karakter. Længere strenge har 4bytes overhead i stedet for 1. Lange strenge komprimeres automatisk af systemet, så det fysiske behov på disken kan være mindre. Meget lange værdier lagres også i baggrundstabeller, så de ikke forstyrrer den hurtige adgang til kortere kolonneværdier.Under alle omstændigheder er den længste mulige tegnstreng, der kan lagres, ca. 1 GB. (Den maksimale værdi, der tillades for i datatypedeklarationen, er mindre end det. Det ville ikke være nyttigt at ændre dette, fordi antallet af tegn og bytes kan være meget forskelligt med multibyte-tegnkodninger. Hvis du ønsker at lagre lange strenge med ingen specifik øvre grænse, skal du bruge tekst eller tegn, der varierer uden en længdeangivelse, i stedet for at finde på en vilkårlig længdegrænse.)

Tip: Der er ingen forskel i ydeevnen mellem disse tre typer, bortset fra øget lagerplads, når du bruger den blank-polstrede type, og et par ekstra CPU-cyklusser til at kontrollere længden, når du lagrer i en kolonne med længdebegrænsninger. Mens karakter(n) har ydelsesmæssige fordele i nogle andre databasesystemer, er der ingen sådanne fordele i PostgreSQL; faktisk er karakter(n) normalt den langsomste af de tre på grund af de ekstra lageromkostninger. I de fleste situationer bør man i stedet bruge stext eller charactervarying.

Referer til afsnit 4.1.2.1 for oplysninger om syntaks for string literals, og til kapitel 9 for oplysninger om tilgængelige operatorer og funktioner. Databasens tegnsæt bestemmer det tegnsæt, der bruges til at gemme tekstværdier; for yderligere oplysninger om understøttelse af tegnsæt henvises til afsnit 22.3.

Eksempel 8-1. Brug af tegentyperne

CREATE TABLE test1 (a character(4));INSERT INTO test1 VALUES ('ok');SELECT a, char_length(a) FROM test1; -- (1) a | char_length------+------------- ok | 2CREATE TABLE test2 (b varchar(5));INSERT INTO test2 VALUES ('ok');INSERT INTO test2 VALUES ('good ');INSERT INTO test2 VALUES ('too long');ERROR: value too long for type character varying(5)INSERT INTO test2 VALUES ('too long'::varchar(5)); -- explicit truncationSELECT b, char_length(b) FROM test2; b | char_length-------+------------- ok | 2 good | 5 too l | 5
(1) Funktionen char_length eromtalt i afsnit 9.4.

Der er to andre tegntyper med fast længde i PostgreSQL, som er vist i Tabel8-5. Navnetypen eksisterer kun til lagring af identifikatorer i de interne systemkataloger og er ikke beregnet til brug for den almindelige bruger. Dens længde er i øjeblikket defineret som 64 bytes (63 anvendelige tegn plus terminator), men bør refereres ved hjælp af konstanten NAMEDATALEN i C-kildekode. Længden indstilles på kompileringstidspunktet (og kan derfor justeres til specielle formål); den maksimale standardlængde kan ændres i en fremtidig udgave. Typen “char” (bemærk anførselstegnene) adskiller sig fra char(1), idet den kun bruger én byte lagerplads. Den anvendes internt i systemkatalogerne som en forenklet opregningstype.

Tabel 8-5. Særlige tegntyper

Navn Storage Size Beskrivelse
“char” 1 byte single-byte intern type
navn 64 bytes intern type for objektnavne

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.