Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jaka jest główna różnica między Varchar2 a char

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:

  1. Tworzysz plik lub raport o stałej długości i przypisujesz wartość inną niż null do char unika konieczności kodowania rpad() wyrażenie. Na przykład, jeśli firstname i lastname oba są zdefiniowane jako char(20) , a następnie firstname || lastname jest krótszym sposobem na napisanie rpad(firstname,20) || rpad(lastname,20) stworzyć Chuck Norris .
  2. Musisz rozróżnić między wyraźnym pustym ciągiem '' i null . Zwykle są to to samo w Oracle, ale przypisanie '' do char value wywoła zachowanie pustego dopełnienia, podczas gdy null 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.
  3. 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ć.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić format daty z MM/DD/RRRR na RRRR-MM-DD w PL/SQL?

  2. Optymalizacja zapytania SELECT, które działa wolno w Oracle, które działa szybko w SQL Server

  3. Różnica w obsłudze przestrzeni między Oracle a SQL Server

  4. Jak uzyskać definicję tabeli w Oracle?

  5. Dzielenie ciągu na wiele wierszy w Oracle