8.3. Teckentyper

Tabell 8-4. Teckentyper

Namn Beskrivning
teckenvarierande(n), varchar(n) variabel-längd med begränsning
tecken(n), char(n) fast längd, blank padded
text variabel obegränsad längd

Tabell8-4 visar de generella teckentyper som finns tillgängliga iPostgreSQL.

SQL definierar två primära teckentyper: character varying(n) och character(n), därren är ett positivt heltal. Båda dessa typer kan lagra strängar som är upp till n tecken (inte bytes) långa. Ett försök att lagra en längre sträng i en kolumn av dessa typer kommer att resultera i ett fel, såvida inte de överflödiga tecknen är alla mellanslag, i vilket fall strängen kommer att avkortas till den maximala längden (detta något bisarra undantag krävs av SQL-standarden).) Om strängen som skall lagras ärkortare än den deklarerade längden, kommer värden av typen character att fyllas på med mellanslag; värden av typencharactervarying kommer helt enkelt att lagra den kortare strängen.

Om man uttryckligen kastar ett värde till charactervarying(n) eller character(n), kommer ett värde med en överlängd att avkortas till n tecken utan att det uppstår ett fel. (Detta krävs av SQL-standarden.)

Notationerna varchar(n) och char(n) är alias för charactervarying(n)respektive character(n). character utan längdangivelse är likvärdigt med character(1). Om charactervarying används utan längdangivare accepterar typen strängar av alla storlekar. Det sistnämnda är ett PostgreSQL-tillägg.

Det senare är ett PostgreSQL-tillägg.

Det finns dessutom i PostgreSQL en texttyp som lagrar strängar av valfri längd. Även om typen text inte finns i SQL-standarden har flera andra SQL-databashanteringssystem den också.

Värden av typen character är fysiskt fyllda med mellanslag till den angivna bredden n, och lagras och visas på detta sätt.Men mellanslagen behandlas som semantiskt obetydliga. Spårutrymmen ignoreras när två värden av typen tecken jämförs, och de tas bort när ett teckenvärde konverteras till någon av de andra strängtyperna. Observera att efterföljande mellanslag är semantiskt betydelsefulla i tecken som varierar och textvärden, och vid användning av mönstermatchning, t.ex. LIKE, reguljära uttryck.

Slagringsbehovet för en kort sträng (upp till 126 byte) är 1 byte plus själva strängen, vilket inkluderar mellanslagspåfyllning i fallet med tecken. Längre strängar har 4 bytes overhead i stället för 1. Långa strängar komprimeras automatiskt av systemet, så det fysiska behovet på disk kan vara mindre. Mycket långa värden lagras också i bakgrundstabeller så att de inte stör den snabba åtkomsten till kortare kolumnvärden.I vilket fall som helst är den längsta möjliga teckensträng som kan lagras cirka 1 GB. (Det maximala värdet som tillåts för forn i datatypsdeklarationen är mindre än så. Det skulle inte vara användbart att ändra detta eftersom antalet tecken och bytes kan vara ganska olika med multibyte teckenkodningar. Om du vill lagra långa strängar utan någon specifik övre gräns, använd text eller tecken som varierar utan längdspecifikation, i stället för att hitta på en godtycklig längdgräns.)

Tip: Det finns ingen prestandaskillnad mellan dessa tre typer, bortsett från ökat lagringsutrymme när du använder den blank-paddade typen, och några extra CPU-cykler för att kontrollera längden när du lagrar till en kolumn med begränsning av längden. Medan character(n) har prestandafördelar i vissa andra databassystem finns det inga sådana fördelar i PostgreSQL; i själva verket är character(n) vanligtvis den långsammaste av de tre typerna på grund av dess extra lagringskostnader. I de flesta situationer börstext eller charactervarying användas istället.

Se avsnitt 4.1.2.1 för information om syntaxen för stränglitteraler, och kapitel 9 för information om tillgängliga operatorer och funktioner. Databasens teckenuppsättning bestämmer den teckenuppsättning som används för att lagra textvärden; mer information om stöd för teckenuppsättning finns i avsnitt 22.3.

Exempel 8-1. Användning av teckentyperna

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 diskuteras i avsnitt 9.4.

Det finns två andra teckentyper med fast längd i PostgreSQL, som visas i tabell 8-5. Namntypen finns endast för lagring av identifierare i de interna systemkatalogerna och är inte avsedd att användas av den allmänna användaren. Dess längd är för närvarande definierad som 64 bytes (63 användbara tecken plus terminator) men bör refereras med hjälp av konstanten NAMEDATALEN i C-källkod. Längden fastställs vid kompileringstillfället (och kan därför justeras för speciella användningsområden); den maximala standardlängden kan komma att ändras i en framtida version. Typen “char” (observera citattecken) skiljer sig från char(1) genom att den endast använder en byte av lagringsutrymme. Den används internt i systemkatalogerna som en förenklad uppräkningstyp.

Tabell 8-5. Särskilda teckentyper

Namn Slagringsstorlek Beskrivning
“char” 1 byte singel-byte intern typ
namn 64 byte intern typ för objektsnamn

Lämna ett svar

Din e-postadress kommer inte publiceras.