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
charunika konieczności kodowaniarpad()wyrażenie. Na przykład, jeślifirstnameilastnameoba są zdefiniowane jakochar(20), a następniefirstname || lastnamejest 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''docharvalue wywoła zachowanie pustego dopełnienia, podczas gdynullnie, 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ć.