Chociaż istnieje już kilka odpowiedzi poprawnie opisujących zachowanie char
, myślę, że trzeba powiedzieć, że nie należy go używać z wyjątkiem trzech konkretnych sytuacji:
- Tworzysz plik lub raport o stałej długości i przypisujesz wartość inną niż null do
char
unika konieczności kodowaniarpad()
wyrażenie. Na przykład, jeślifirstname
ilastname
oba są zdefiniowane jakochar(20)
, a następniefirstname || lastname
jest krótszym sposobem na napisanierpad(firstname,20) || rpad(lastname,20)
stworzyćChuck Norris
. - Musisz rozróżnić między wyraźnym pustym ciągiem
''
inull
. Zwykle są to to samo w Oracle, ale przypisanie''
dochar
value wywoła zachowanie pustego dopełnienia, podczas gdynull
nie, więc jeśli ważne jest, aby odróżnić, a naprawdę nie mogę wymyślić powodu, dla którego miałoby być, to masz na to sposób. - Twój kod jest przeniesiony z innego systemu (lub musi być z nim zgodny), który wymaga pustego wypełnienia ze względu na starsze przyczyny. W takim razie utkniesz z tym i masz moje współczucie.
Naprawdę nie ma powodu, aby używać char
tylko dlatego, że pewna długość jest stała (np. Y/N
flaga lub kod waluty ISO, taki jak 'USD'
). Nie jest bardziej wydajny, nie oszczędza miejsca (nie ma mitycznego wskaźnika długości dla varchar2
, jest tylko pusty narzut wypełnienia dla char
) i nie powstrzymuje nikogo przed wprowadzaniem krótszych wartości. (Jeśli wpiszesz 'ZZ '
w swoim char(3)
kolumna waluty, zostanie po prostu zapisana jako 'ZZ '
.) Nie jest nawet wstecznie kompatybilny z jakąś starożytną wersją Oracle, która kiedyś na nim polegała, ponieważ nigdy jej nie było.
A zaraza może się rozprzestrzeniać, ponieważ (zgodnie z najlepszą praktyką) możesz zakotwiczyć deklarację zmiennej za pomocą czegoś takiego jak sales.currency%type
. Teraz Twoja l_sale_currency
zmienna jest ukrytym char
które zostaną niewidocznie wypełnione puste dla krótszych wartości (lub ''
), otwierając drzwi, aby ukryć błędy, w których l_sale_currency
nie równa się l_refund_currency
nawet jeśli przypisałeś 'ZZ '
do obu.
Niektórzy twierdzą, że char(n)
(gdzie n to pewna długość znaków) wskazuje, że oczekuje się, że wartości będą n znaków długich i jest to forma autodokumentacji. Ale z pewnością, jeśli poważnie myślisz o formacie 3-znakowym (na przykład kody krajów ISO-Alpha-3 zamiast ISO-Alpha-2), czy nie zdefiniowałbyś ograniczenia w celu wymuszenia reguły, zamiast pozwolić programistom spojrzeć na char(3)
typ danych i wyciągnąć własne wnioski?
CHAR
został wprowadzony w Oracle 6, jestem pewien, ze względu na kompatybilność z ANSI. Prawdopodobnie są potencjalni klienci decydujący, który produkt bazodanowy kupić i zgodność z ANSI znajduje się na ich liście kontrolnej (lub kiedyś był), a CHAR
z pustym dopełnieniem jest zdefiniowane w standardzie ANSI, więc Oracle musi je zapewnić. Nie powinieneś go właściwie używać.