Oracle ma trzy datatypy do przechowywania ciągów znaków. – CHAR, VARCHAR i VARCHAR2. Czym się one różnią od siebie? Kiedy należy używać którego z nich?
Poznajmy odpowiedzi w tym artykule.
Najpierw najprostsza rzecz: VARCHAR i VARCHAR2 są takie same. Ale to dzisiaj – to może się zmienić. Zajrzyj do dokumentacji Oracle 10G Release 2:
Nie używaj typu danych
VARCHAR
. Zamiast tego użyj typu danychVARCHAR2
. Chociaż typ danychVARCHAR
jest obecnie synonimemVARCHAR2
, typ danychVARCHAR
ma zostać przedefiniowany jako oddzielny typ danych używany dla łańcuchów znaków o zmiennej długości z różnymi semantykami porównywania.
W tym artykule, VARCHAR2 jest używany w znaczeniu zarówno VARCHAR jak i VARCHAR2, ponieważ są one obecnie równoważne.
Jak więc CHAR i VARCHAR2 różnią się między sobą?
Różnica polega na tym, że CHAR(n) ZAWSZE będzie miał długość n bajtów. Jeśli długość łańcucha wynosi <n, będzie on pusto wypełniony przy wstawianiu, aby zapewnić długość n. VARCHAR2(n) z drugiej strony będzie miał długość od 1 do n bajtów. Krótszy łańcuch przechowywany jako VARCHAR2 NIE będzie wyściełany do pustego miejsca.
Na przykład, załóżmy, że przechowujesz łańcuch 'ORATABLE’ w polu CHAR(20) i VARCHAR2(20). Pole CHAR będzie wykorzystywać 22 bajty (2 bajty na długość wiodącą). Pole VARCHAR2 użyje tylko 10 bajtów (8 na łańcuch, 2 bajty na długość wiodącą).
Podsumowując, CHAR jest VARCHAR2 wyściełanym do jego maksymalnej długości.
Jak ta różnica wpływa na SQL?
To zmienia sposób dopasowywania łańcuchów w CHAR vs VARCHAR2. Sprawdź to w akcji:
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
Więc widzisz, padding z pustymi miejscami robi różnicę w tym, czy ciąg CHAR zostanie dopasowany do parametru o zmiennej długości. Aby uzyskać dopasowanie, musisz albo rpad the value albo rtrim the column.
Nie ma takiego wymogu w przypadku VARCHAR2:
SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found
Kiedy powinniśmy używać CHAR, a kiedy VARCHAR2?
Jeśli tylko kiedykolwiek używasz VARCHAR2 i ignorujesz CHAR, znacznie uprościsz sobie życie. Nie ma żadnej różnicy między tymi dwoma, z wyjątkiem tego, że CHAR zużywa więcej miejsca, gdy twoje ciągi nie zawsze mają ustaloną maksymalną długość. Dodatkowo, CHAR prowadzi do większego zamieszania przy pisaniu zapytań.
Używam CHAR jako kolumny bazy danych tylko dla wartości typu Y/N. (Nie ma typu danych kolumny BOOLEAN, pamiętasz?) Działa to jak znacznik dla kolumny typu „flaga” lub „przełącznik” – ale równie dobrze mógłby to być VARCHAR2.
Dla wszystkich innych ciągów jest to VARCHAR2.
Podsumowanie
Przy rozważaniu typów danych Oracle CHAR, VARCHAR i VARCHAR2 należy pamiętać, że:
- VARCHAR i VARCHAR2 są takie same, ale funkcja VARCHAR może się zmienić w przyszłości. Używaj VARCHAR2.
- CHAR i VARCHAR2 różnią się tym, że CHAR wyściela swoje łańcuchy tak, aby miały maksymalną długość. VARCHAR2 nie stosuje żadnego wypełniania.
- Z powodu powyższego zapytania, które obejmują porównywanie łańcuchów w kolumnie CHAR, wymagają większej ostrożności – VARCHAR2 w porównaniu z CHAR musi być rpad-ded, aby uzyskać trafienie.
- Należy powtórzyć: użyj VARCHAR2!
.