Oracle posiada kilka typów danych znakowych, które są powszechnie używane i mogą być mylące, jeśli nie znasz różnic między nimi. Dowiedz się, czym są i jakie są różnice między nimi w tym artykule.
Znakowe typy danych w Oracle, które są najczęściej używane, to CHAR i VARCHAR2. Istnieje również typ danych VARCHAR.
Zobaczmy, czym jest każdy z tych typów danych.
CHAR Datatype
Typ danych CHAR przechowuje wartości znakowe. Przechowuje te wartości jako łańcuch o stałej długości.
To oznacza, że wartości łańcuchowe będą wypełnione lub będą miały dodane do nich znaki spacji, aby mogły być przechowywane w bazie danych.
Maksymalna długość wartości CHAR wynosi 2000 bajtów.
Zobaczmy tego przykład.
Powstanie przykładowa tabela wykorzystująca wszystkie trzy z tych typów danych, wstawię trochę danych i zobaczę, co pokaże.
CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));
Teraz wstawmy wartość.
INSERT INTO chartest (char_column)VALUES ('abcde');
Teraz zapytajmy o wartość. Zapytam o wartość i wartość wewnątrz nawiasów (aby zobaczyć, gdzie są spacje), sprawdzę długość, a następnie wykonam DUMP, aby zobaczyć niektóre statystyki.
SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;
Result:
CHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
abcde | (abcde ) | 10 | Typ=96 Len=10: 97,98,99,100,101,32,32,32,32 |
Jak widać, wartość abcde została wypełniona spacjami podczas przechowywania, aby jej długość wynosiła 10. Na wyjściu funkcji DUMP można zobaczyć kody dla każdego zapisanego znaku. Znak 32 jest spacją.
VARCHAR Datatype
Typ danych VARCHAR jest standardowym typem danych ANSI, dlatego jest uwzględniony w Oracle.
Jednakże w chwili obecnej jest taki sam jak typ danych VARCHAR2.
Został uwzględniony w Oracle, aby umożliwić rozróżnienie między NULL a pustymi łańcuchami, co jest tym, co VARCHAR powinien robić, zgodnie ze standardem ANSI. Jednakże, w Oracle, nie robi tego. Działa jak VARCHAR2, gdzie puste ciągi są traktowane jako wartości NULL.
Więc w Oracle różnica między VARCHAR i VARCHAR2 jest żadna. Są one takie same.
Nie powinieneś używać typu danych VARCHAR, ponieważ jest on zarezerwowany dla przyszłej funkcjonalności Oracle i może się zmienić.
Zobaczmy przykład. Użyjemy tej samej tabeli, co wcześniej, i wstawimy pewne dane.
INSERT INTO chartest (varchar_column)VALUES ('fghij');
Teraz wybierzmy te dane.
SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;
Wynik:
VARCHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
fghij | (fghij) | 5 | Typ=1 Len=5: 102,103,104,105,106 |
Widzisz, że wartość w nawiasach nie zawiera spacji, a to dlatego, że VARCHAR2 i VARCHAR nie dodają spacji (co omówię za chwilę). Ma ona również długość 5 znaków.
VARCHAR2 Datatype
Typ danych VARCHAR2 służy do przechowywania łańcuchów o zmiennej długości. Oznacza to, że określasz maksymalny rozmiar, a łańcuchy, które wstawisz do kolumny, będą przechowywane w takiej postaci, w jakiej zostały podane. Do znaków nie będą dodawane spacje, tak jak w przypadku typu danych CHAR.
Maksymalna długość typu danych VARCHAR2 wynosi 4000 bajtów. Została ona jednak podniesiona do 32 767 bajtów jako jedna z nowych funkcji w Oracle 12c.
Zobaczmy przykład.
INSERT INTO chartest (varchar2_column)VALUES ('klmno');
Następnie wykonajmy zapytanie o wynik.
SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;
Wynik:
VARCHAR2_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
klmno | (klmno) | 5 | Typ=1 Len=5: 107,108,109,110,111 |
Widać, że dane wyjściowe są takie same jak w przykładzie VARCHAR. Nie zostały dodane żadne spacje, a długość jest taka sama. Jedyną różnicą są znaki kodu ASCII, ponieważ ciąg wejściowy był inny.
Różnice: CHAR vs VARCHAR vs VARCHAR2
Przyjrzyjrzyjmy się różnicom między tymi trzema typami danych.
- VARCHAR i VARCHAR2 są dokładnie takie same. CHAR jest inny.
- CHAR ma maksymalny rozmiar 2000 bajtów, a VARCHAR/VARCHAR2 ma maksymalny rozmiar 4000 bajtów (lub 32 767 w Oracle 12c)
- CHAR nie wymaga określenia rozmiaru i ma domyślnie 1. Rozmiar musi być określony dla kolumn VARCHAR/VARCHAR2.
- CHAR wyściela spacje po prawej stronie łańcuchów, aby dopasować długość kolumny, podczas gdy VARCHAR/VARCHAR2 nie.
Wydajność CHAR, VARCHAR i VARCHAR2 jest taka sama. Nie ma różnicy w wydajności w przypadku tych typów danych. CHAR nie jest szybszy niż VARCHAR2, a VARCHAR2 nie jest szybszy niż CHAR.
Tom Kyte ma post na AskTom, który wyjaśnia szczegóły techniczne tego. Wyjaśnia również, że puste wyściełanie VARCHAR2 jest dokładnie takie samo jak wartość CHAR.
Pomyśl o tym przez chwilę.
Puste wyściełanie wartości VARCHAR2 jest takie samo jak wartość CHAR.
Typy danych są prawie identyczne.
Więc, którego z tych typów danych powinieneś użyć?
Jak Tom Kyte omówił na swoim forum i w swojej książce (z czym się zgadzam), nie ma powodu, aby kiedykolwiek używać typu danych CHAR. VARCHAR2 może pokryć wszystkie sytuacje, w których CHAR może być brany pod uwagę – nawet CHAR(1), który jest taki sam jak VARCHAR2(1).
VARCHAR vs VARCHAR2
Różnica między VARCHAR i VARCHAR2 w Oracle jest taka, że VARCHAR jest typem danych w standardzie ANSI, który obsługuje rozróżnienie między NULL i pustymi łańcuchami. Oracle nie wprowadził jeszcze tego rozróżnienia, więc w tej chwili VARCHAR i VARCHAR2 są takie same. Bezpieczniej jest używać VARCHAR2, ponieważ nie chcesz, aby jakikolwiek kod się zepsuł, jeśli Oracle zmieni VARCHAR w przyszłości, a twój kod używa VARCHAR.