8.3. Merkkityypit

Taulukko 8-4. Merkkityypit

Nimi Kuvaus
merkki varying(n), varchar(n) variable-length with limit
character(n), char(n) kiinteä pituus, tyhjä täytetty
teksti muuttuja rajoittamaton pituus

Taulukossa8-4 on esitetty yleiskäyttöiset merkkityypit, jotka ovat käytettävissäPostgreSQL:ssä.

SQL määrittelee kaksi ensisijaista merkkityyppiä: character varying(n) ja character(n), jossaeren on positiivinen kokonaisluku. Molemmat näistä tyypeistä voivat tallentaa merkkijonoja, joiden pituus on enintään n merkkiä (ei tavua). Yritys tallentaa pidempi merkkijono näiden tyyppien sarakkeeseen johtaa virheeseen, paitsi jos ylimääräiset merkit ovat kaikki välilyöntejä, jolloin merkkijono typistetään maksimipituuteen (tämä hieman outo poikkeus on SQL-standardin vaatimus).) Jos tallennettava merkkijono on lyhyempi kuin ilmoitettu pituus, character-tyyppiset arvot täydennetään välilyönneillä; arvot, jotka ovat tyypiltääncharacter varying, yksinkertaisesti tallentavat lyhyemmän merkkijonon.

Jos arvo valitaan nimenomaisesti charactervarying(n)- tai character(n)-tyyppiseksi, ylipitkä arvo typistetään n merkkiin ilman virhettä. (SQL-standardi edellyttää tätä.)

Merkinnät varchar(n) ja char(n) ovat peitenimiä merkin varioivalle(n) ja merkille(n). character ilman pituusmääritystä vastaacharacter(1). Jos käytetään charactervarying-tyyppiä ilman pituusmäärittelyä, tyyppi hyväksyy kaikenkokoiset merkkijonot. Jälkimmäinen on PostgreSQL:n laajennus.

PostgreSQL tarjoaa lisäksi text-tyypin, joka tallentaa minkä tahansa pituisia merkkijonoja. Vaikka text-tyyppiä ei ole SQL-standardissa, useissa muissa SQL-tietokannanhallintajärjestelmissä on myös se.

Tyypin character arvot täydennetään fyysisesti välilyönneillä määritettyyn leveyteen n, ja ne tallennetaan ja näytetään siten.Täydennysvälilyöntejä käsitellään kuitenkin semanttisesti merkityksettöminä. Jälkimmäisiä välilyöntejä ei oteta huomioon, kun verrataan kahta merkkityyppistä arvoa, ja ne poistetaan, kun merkkiarvo muunnetaan joksikin muuksi merkkijonotyypiksi. Huomaa, että peräkkäiset välilyönnit ovat semanttisesti merkityksellisiä merkki- ja tekstiarvoissa sekä käytettäessä hahmontäsmäytystä, esim. LIKE, säännölliset lausekkeet.

Lyhyen merkkijonon (enintään 126 tavua) tallennustarve on 1 tavu plus varsinainen merkkijono, joka sisältää välilyönnin, kun kyseessä on merkki. Pidemmissä merkkijonoissa on 4 tavua ylimääräistä tilaa 1 tavun sijaan. Järjestelmä pakkaa pitkät merkkijonot automaattisesti, joten fyysinen tarve levylle saattaa olla pienempi. Hyvin pitkät arvot tallennetaan myös taustataulukoihin, jotta ne eivät häiritse lyhyempien sarakkeiden arvojen nopeaa käyttöä.Joka tapauksessa pisin mahdollinen merkkijono, joka voidaan tallentaa, on noin 1 Gt. (Tietotyyppi-ilmoituksessa sallittu n enimmäisarvo on tätä pienempi). Tätä ei olisi hyödyllistä muuttaa, koska usean tavun merkkikoodauksissa merkkien ja tavujen määrä voi olla hyvinkin erilainen. Jos haluat tallentaa pitkiä merkkijonoja, joilla ei ole erityistä ylärajaa, käytä tekstiä tai merkkejä, jotka vaihtelevat ilman pituuden määrittelyä, sen sijaan että keksisit mielivaltaisen pituusrajan.)

Vinkki: Näillä kolmella tietotyypillä ei ole suorituskykyeroa lukuun ottamatta lisääntynyttä tallennustilaa käytettäessä tyhjäksi täydennettyä tyyppiä ja muutamaa ylimääräistä suoritinsykliä pituuden tarkistamiseen tallennettaessa pituuden suhteen rajoitettuun sarakkeeseen. Vaikka character(n)-tyypillä on suorituskykyetuja joissakin muissa tietokantajärjestelmissä, PostgreSQL:ssä tällaista etua ei ole; itse asiassa character(n)-tyyppi on yleensä näistä kolmesta hitaampi, koska se aiheuttaa ylimääräisiä tallennuskustannuksia. Useimmissa tilanteissa tulisi sen sijaan käyttäästext- tai charactervariointia.

Luvussa 4.1.2.1 on tietoja merkkijonojen kirjoitusmerkkien syntaksista, ja luvussa 9 on tietoja käytettävissä olevista operaattoreista ja funktioista. Tietokannan merkistömäärittää tekstiarvojen tallentamiseen käytettävän merkistöjoukon; lisätietoja merkistötuesta on luvussa 22.3.

Esimerkki 8-1. Merkkityyppien

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
käyttäminen (1) char_length-funktiota käsitellään kohdassa 9.4.

PostgreSQL:ssä on kaksi muuta kiinteäpituista merkkityyppiä, jotka on esitetty taulukossa8-5. Nimityyppi on olemassa vain tunnisteiden tallentamista varten järjestelmän sisäisissä luetteloissa, eikä sitä ole tarkoitettu yleiskäyttäjän käyttöön. Sen pituudeksi on tällä hetkellä määritelty 64 tavua (63 merkkiä ja lopetusmerkki), mutta siihen olisi viitattava käyttämällä C-lähdekoodissa vakiota NAMEDATALEN. Pituus asetetaan käännöshetkellä (ja on siten säädettävissä erityiskäyttöön); oletusarvoinen enimmäispituus saattaa muuttua tulevissa versioissa. Tyyppi “char” (huomaa lainausmerkit) eroaa char(1)-tyypistä siinä, että se käyttää vain yhden tavun tallennustilaa. Sitä käytetään sisäisesti järjestelmäluetteloissa yksinkertaisena luettelointityyppinä.

Taulukko 8-5. Erikoismerkkityypit

Nimi Tallennuskoko Kuvaus
“char” 1 tavu yksittäinen-tavun sisäinen tyyppi
nimi 64 tavua sisäinen tyyppi objektien nimille

.

Vastaa

Sähköpostiosoitettasi ei julkaista.