8.3. Karakter Types

Tabel 8-4. Karakter-typen

Naam Beschrijving
karakter variërend(n), varchar(n) variabele-lengte met limiet
karakter(n), char(n) vaste-lengte, blanco opgevuld
tekst variabele onbeperkte lengte

Tabel8-4 toont de algemene karakter-types die beschikbaar zijn inPostgreSQL.

SQL definieert twee primaire karakter-typen: character varying(n) en character(n), waarbij n een positief geheel getal is. Beide types kunnen tekenreeksen tot n tekens (geen bytes) opslaan. Een poging om een langere tekenreeks in een kolom van deze types op te slaan zal resulteren in een fout, tenzij de overtollige tekens allemaal spaties zijn, in welk geval de tekenreeks zal worden ingekort tot de maximale lengte. (Deze enigszins bizarre uitzondering wordt vereist door de SQL-standaard.) Als de op te slaan string korter is dan de opgegeven lengte, worden waarden van het type character opgevuld met spaties; waarden van het typecharacter varying slaan de kortere string gewoon op.

Als u een waarde expliciet op charactervarying(n) of character(n) zet, wordt een waarde die langer is dan de opgegeven lengte, afgekapt tot n tekens zonder dat dit een foutmelding oplevert. (Dit is vereist door de SQL-standaard.)

De notaties varchar(n) en char(n) zijn aliassen voor respectievelijk character varying(n)en character(n). character zonder lengte specificatie is equivalent aanaracter(1). Als karaktervariërend wordt gebruikt zonder lengtebepaling, accepteert het type strings van elke grootte. Dit laatste is een PostgreSQL uitbreiding.

Daarnaast biedt PostgreSQL het text type, dat strings van elke lengte opslaat. Hoewel het type tekst niet in de SQL standaard staat, hebben diverse andere SQL database management systemen het ook.

Waarden van het type karakter worden fysiek opgevuld met spaties tot de gespecificeerde breedte n, en worden op die manier opgeslagen en weergegeven.De opvulspaties worden echter als semantisch onbelangrijk behandeld. Spaties achteraan worden genegeerd bij het vergelijken van twee waarden van het type karakter, en ze worden verwijderd bij het omzetten van een karakterwaarde naar een van de andere stringtypes. Merk op dat spaties achteraan semantisch van belang zijn in karakter variërende en tekst waarden, en bij gebruik van patroon matching, b.v. LIKE, reguliere expressies.

De benodigde opslag voor een korte string (tot 126 bytes) is 1 byte plus de eigenlijke string, inclusief de spatie vulling in het geval van character. Langere strings hebben 4 bytes overhead in plaats van 1. Lange strings worden automatisch door het systeem gecomprimeerd, zodat de fysieke behoefte op schijf kleiner kan zijn. Zeer lange waarden worden ook in achtergrondtabellen opgeslagen, zodat ze niet interfereren met snelle toegang tot kortere kolomwaarden. In ieder geval is de langst mogelijke tekenreeks die kan worden opgeslagen ongeveer 1 GB. (De maximale waarde die wordt toegestaan voorn in de datatype-declaratie is minder dan dat. Het zou niet nuttig zijn om dit te veranderen omdat met multibyte tekencoderingen het aantal karakters en bytes nogal kan verschillen. Als u lange tekenreeksen zonder specifieke bovengrens wilt opslaan, gebruik dan tekst of tekenreeksen zonder lengtespecificatie, in plaats van een arbitraire lengtelimiet te verzinnen.)

Tip: Er is geen verschil in prestaties tussen deze drie typen, afgezien van meer opslagruimte wanneer het blanco geplamuurde type wordt gebruikt, en een paar extra CPU-cycli om de lengte te controleren wanneer wordt opgeslagen in een kolom met een lengtebeperking. Terwijl character(n) prestatievoordelen heeft in sommige andere databasesystemen, is er geen dergelijk voordeel in PostgreSQL; in feite is character(n) gewoonlijk de traagste van de drie, vanwege de extra opslagkosten. In de meeste situaties moet in plaats daarvan stxt of charactervarying worden gebruikt.

Refereer naar Paragraaf 4.1.2.1 voor informatie over de syntaxis van string-literals, en naar Hoofdstuk 9 voor informatie over de beschikbare operatoren en functies. De tekenset van de database bepaalt de tekenset die wordt gebruikt om tekstwaarden op te slaan; voor meer informatie over de ondersteuning van tekensets, zie Paragraaf 22.3.

Voorbeeld 8-1. Gebruik van de Karakter Types

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) De char_length functie wordt besproken in Paragraaf 9.4.

Er zijn nog twee andere vaste-lengte karakter types in PostgreSQL, getoond in Tabel8-5. Het type name bestaat alleen voor de opslag van identifiers in de interne systeemcatalogi en is niet bedoeld voor gebruik door de algemene gebruiker. De lengte is momenteel gedefinieerd als 64 bytes (63usable karakters plus terminator) maar moet worden gerefereerd met behulp van de constante NAMEDATALEN in C broncode. De lengte wordt ingesteld tijdens het compileren (en is dus aanpasbaar voor speciale toepassingen); de standaard maximumlengte zou in een toekomstige versie kunnen veranderen. Het type “char” (let op de aanhalingstekens) verschilt van char(1) in die zin dat het slechts één byte aan opslagruimte gebruikt. Het wordt intern gebruikt in de systeemcatalogi als een simplistisch opsommingstype.

Tabel 8-5. Special Character Types

Name Storage Size Description
“char” 1 byte single-byte intern type
naam 64 bytes intern type voor objectnamen

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.