CAR:n, VARCHAR:n ja VARCHAR2:n ero

Oracle tarjoaa kolme tietotyyppiä merkkijonojen tallentamiseen. – CHAR, VARCHAR ja VARCHAR2. Miten ne eroavat toisistaan? Milloin kannattaa käyttää kumpaa?

Vastaukset selvitetään tässä artikkelissa.

Yksinkertaisin asia ensin pois tieltä: VARCHAR ja VARCHAR2 ovat sama asia. Mutta että tämä tänään – tämä saattaa muuttua. Tutustu Oraclen dokumentaatioon 10G Release 2:

Ei saa käyttää tietotyyppiä VARCHAR. Käytä sen sijaan VARCHAR2 tietotyyppiä. Vaikka VARCHAR-tietotyyppi on tällä hetkellä synonyymi VARCHAR2:n kanssa, VARCHAR-tietotyyppi on tarkoitus määritellä uudelleen erilliseksi tietotyypiksi, jota käytetään vaihtelevan pituisille merkkijonoille, joita verrataan eri vertailusemantiikalla.

Tässä artikkelissa VARCHAR2:lla tarkoitetaan sekä VARCHAR:ia että VARCHAR2:ta, koska ne vastaavat nykyään toisiaan.

Miten CHAR ja VARCHAR2 sitten eroavat toisistaan?

Ero on siinä, että CHAR(n) on AINA n tavua pitkä. Jos merkkijonon pituus on <n, se täytetään tyhjäksi lisäämisen yhteydessä, jotta sen pituus olisi n. VARCHAR2(n) puolestaan on 1-n tavun pituinen. Lyhyempää merkkijonoa, joka on tallennettu VARCHAR2-kenttänä, EI täydennetä tyhjäksi.

Esitetään esimerkiksi, että tallennat merkkijonon ’ORATABLE’ CHAR(20)-kenttään ja VARCHAR2(20)-kenttään. CHAR-kenttä käyttää 22 tavua (2 tavua johtavan pituuden vuoksi). VARCHAR2-kenttä käyttää vain 10 tavua (8 tavua merkkijonoon, 2 tavua etumittaan).

Yhteenvetona voidaan todeta, että CHAR-kenttä on VARCHAR2-kenttä, joka on täydennetty maksimipituuteensa.

Miten tämä ero vaikuttaa SQL-tietokantoihin?

Tämä muuttaa tapaa, jolla merkkijonoja sovitetaan yhteen CHAR:n ja VARCHAR2:n välillä. Tarkista se käytännössä:

SQL> create table strings 2 (colchar char (20) 3 , colvarchar varchar2 (20));Table created.SQL>SQL> insert into strings 2 (colchar, colvarchar) 3 values 4 ('ORATABLE', 'ORATABLE');1 row created.SQL> -- Define a string variableSQL> var str varchar2(20)SQL> -- Give it a value with length < 20SQL> exec :str := 'ORATABLE'PL/SQL procedure successfully completed.SQL> -- Exact string match with CHARSQL> -- No result found!SQL> select 'found' found_flag 2 from strings 3 where colchar = :str;no rows selectedSQL> -- Padded string match with CHARSQL> -- Now it finds itSQL> select 'found' found_flag 2 from strings 3 where colchar = rpad(:str,20);FOUND-----found

Näet siis, että tyhjillä pehmustaminen vaikuttaa siihen, sovitetaanko CHAR-merkkijono muuttuvan pituisen parametrin kanssa. Jos haluat saada vastaavuuden, sinun on joko rpadattava arvo tai rtrim-pylväs.

Ei tällaista vaatimusta VARCHAR2:n kanssa:

SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found

Milloin pitäisi käyttää CHAR:ia, milloin VARCHAR2:ia?

Jos käytät aina vain VARCHAR2:ia ja jätät CHAR:n huomiotta, teet elämästäsi paljon yksinkertaisempaa. Näiden kahden välillä ei ole mitään eroa, paitsi että CHAR kuluttaa enemmän tilaa, kun merkkijonot eivät aina ole kiinteän maksimipituuden mukaisia. Lisäksi CHAR aiheuttaa enemmän sekaannusta kyselyiden kirjoittamisessa.

Käytän CHAR-merkkejä tietokantasarakkeina vain Y/N-tyyppisten arvojen kohdalla. (Muistatteko, että BOOLEAN-sarakkeen tietotyyppiä ei ole?) Tämä toimii ikään kuin merkkinä ”lipun” tai ”kytkimen” tyyppiselle sarakkeelle – mutta se olisi yhtä hyvin voinut olla VARCHAR2.

Kaikkien muiden merkkijonojen kohdalla se on VARCHAR2.

Yhteenveto

Kun tarkastelet Oraclen tietotyyppejä CHAR, VARCHAR ja VARCHAR2, muista, että:

  • VARCHAR ja VARCHAR2 ovat samoja, mutta VARCHARin funktio saattaa muuttua tulevaisuudessa. Käytä VARCHAR2:ta.
  • CHAR ja VARCHAR2 eroavat toisistaan siinä, että CHAR tyhjentää merkkijononsa maksimipituuteensa. VARCHAR2 ei täytä tyhjiä.
  • Edellisen vuoksi kyselyt, joihin liittyy merkkijonojen vertailu CHAR-sarakkeessa, vaativat enemmän varovaisuutta – VARCHAR2:n ja CHAR:n välinen vertailu vaatii rpad-ded-täydennystä osuman saamiseksi.
  • Kannattaa toistaa: käytä VARCHAR2:ta!

Vastaa

Sähköpostiosoitettasi ei julkaista.