Oraclessa on useita merkkitietotyyppejä, joita käytetään yleisesti ja jotka voivat olla myös hämmentäviä, jos et tiedä niiden eroja. Lue tässä artikkelissa, mitä ne ovat ja mitä eroja niiden välillä on.
Oraclen useimmin käytetyt merkkitietotyypit ovat CHAR ja VARCHAR2. On olemassa myös VARCHAR-tietotyyppi.
Katsotaan, mitä nämä tietotyypit ovat.
CHAR-tietotyyppi
CHAR-tietotyyppi tallentaa merkkiarvoja. Se tallentaa nämä arvot kiinteäpituisena merkkijonona.
Tämä tarkoittaa, että merkkijonoarvot täytetään eli niihin lisätään välilyöntimerkkejä, jotta ne voidaan tallentaa tietokantaan.
CHAR-arvon enimmäispituus on 2000 tavua.
Katsotaanpa esimerkki tästä.
Luotaan esimerkkitaulukko, jossa käytetään kaikkia kolmea näistä tietotyypeistä, lisätään tietoja ja katsotaan, mitä se näyttää.
CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));
Lisätään nyt arvo.
INSERT INTO chartest (char_column)VALUES ('abcde');
Kysytään nyt arvoa. Kysyn arvon ja sulkujen sisällä olevan arvon (nähdäkseni, missä välilyönnit ovat), tarkistan pituuden ja suoritan sen jälkeen DUMP:in nähdäkseni joitakin tilastoja.
SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;
Tulos:
CHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
abcde | (abcde ) | 10 | Typ=96 Len=10: 97,98,99,100,101,32,32,32,32,32,32 |
Kuten näet, abcde:n arvo on tallennettaessa täytetty välilyönneillä, jotta sen pituus olisi 10. DUMP-funktion tulosteessa näet jokaisen tallennetun merkin koodit. Merkki 32 on välilyönti.
VARCHAR-tietotyyppi
VARCHAR-tietotyyppi on ANSI-standardin mukainen tietotyyppi, minkä vuoksi se on mukana Oraclessa.
Mutta tällä hetkellä se on sama kuin VARCHAR2-tietotyyppi.
Tietotyyppi otettiin mukaan Oraclessa, jotta NULL- ja tyhjien merkkijonojen välille saatiin tehtyä ero, mikä VARCHAR-tietotyypin kuuluukin tehdä ANSI-standardin mukaan. Oraclessa se ei kuitenkaan tee sitä. Se toimii kuten VARCHAR2, jossa tyhjiä merkkijonoja käsitellään NULL-arvoina.
Oraclessa VARCHARin ja VARCHAR2:n välinen ero ei siis ole mitään. Ne ovat sama asia.
Ei kannata käyttää VARCHAR-tietotyyppiä, koska se on varattu tulevaa Oracle-toiminnallisuutta varten ja se voi muuttua.
Katsotaanpa esimerkki. Käytetään samaa taulukkoa kuin aiemmin ja lisätään joitakin tietoja.
INSERT INTO chartest (varchar_column)VALUES ('fghij');
Valitaan nyt nämä tiedot.
SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;
Tulos:
VARCHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
fghij | (fghij) | 5 | Typ=1 Len=5: 102,103,104,105,106 |
Voit nähdä, että suluissa oleva arvo ei sisällä välilyöntejä, mikä johtuu siitä, että VARCHAR2 ja VARCHAR eivät lisää välilyöntejä (josta puhun hetken kuluttua). Sen pituus on myös 5 merkkiä.
VARCHAR2-tietotyyppi
VARCHAR2-tietotyyppiä käytetään vaihtelevan pituisten merkkijonojen tallentamiseen. Tämä tarkoittaa, että määrittelet enimmäiskoon, ja sarakkeeseen lisättävät merkkijonot tallennetaan sellaisina kuin ne on annettu. Merkkiin ei lisätä välilyöntejä, kuten CHAR-tietotyypissä.
VARCHAR2-tietotyypin enimmäispituus on 4000 tavua. Tämä nostettiin kuitenkin 32 767 tavuun yhtenä Oraclen 12c:n uutena ominaisuutena.
Katsotaanpa esimerkki.
INSERT INTO chartest (varchar2_column)VALUES ('klmno');
Kysytään nyt tulosta.
SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;
Tulos:
VARCHAR2_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
klmno | (klmno) | 5 | Typ=1 Len=5: 107,108,109,110,111 |
Voit nähdä, että tuloste on sama kuin VARCHAR-esimerkissä. Välilyöntejä ei ole lisätty, ja pituus on sama. Ainoa ero on ASCII-koodimerkit, koska syöttömerkkijono oli erilainen.
Eroja: CHAR vs VARCHAR vs VARCHAR2
Katsotaanpa näiden kolmen tietotyypin eroja.
- VARCHAR ja VARCHAR2 ovat täsmälleen samanlaisia. CHAR on erilainen.
- CHARin maksimikoko on 2000 tavua ja VARCHAR/VARCHAR2:n maksimikoko on 4000 tavua (tai 32 767 tavua Oracle 12c:ssä)
- CHARille ei tarvitse määrittää kokoa, ja sen oletusarvo on 1. VARCHAR/VARCHAR2-sarakkeille on määritettävä koko.
- CHAR täyttää merkkijonojen oikealla puolella olevat välilyönnit sarakkeen pituuden mukaisiksi, kun taas VARCHAR/VARCHAR2 ei täytä välilyöntejä.
CHAR-, VARCHAR- ja VARCHAR2-sarakkeiden suorituskyky on sama. Näiden tietotyyppien suorituskyvyssä ei ole eroa. CHAR ei ole nopeampi kuin VARCHAR2, eikä VARCHAR2 ole nopeampi kuin CHAR.
Tom Kyte on kirjoittanut AskTomissa postauksen, jossa selitetään tämän tekniset yksityiskohdat. Hän selittää myös, että tyhjäksi täytetty VARCHAR2-arvo on täsmälleen sama kuin CHAR-arvo.
Ajattele tätä hetki.
Tyhjäksi täytetty VARCHAR2-arvo on sama kuin CHAR-arvo.
Tietotyypit ovat lähes identtiset.
Kumpaa näistä tietotyypeistä sinun pitäisi siis käyttää?
Kuten Tom Kyte on käsitellyt foorumillaan ja kirjassaan (ja olen samaa mieltä), ei ole mitään syytä koskaan käyttää CHAR-tietotyyppiä. VARCHAR2 voi kattaa kaikki tilanteet, joissa CHARia voitaisiin harkita – jopa CHAR(1), joka on sama kuin VARCHAR2(1).
VARCHAR vs. VARCHAR2
Oraclessa VARCHARin ja VARCHAR2:n ero on siinä, että VARCHAR on ANSI-standardin mukainen tietotyyppi, joka tukee NULL- ja tyhjien merkkijonojen erottelua. Oracle ei ole vielä toteuttanut tätä erottelua, joten tällä hetkellä VARCHAR ja VARCHAR2 ovat samat. On turvallisempaa käyttää VARCHAR2:ta, koska et halua minkään koodin rikkoutuvan, jos Oracle muuttaa VARCHARia tulevaisuudessa ja koodisi käyttää VARCHARia.