2008-09-17 27 views

Odpowiedz

219

Załóżmy, że zestaw znaków bazy danych to UTF-8, który jest zalecanym ustawieniem w najnowszych wersjach Oracle. W takim przypadku niektóre znaki wymagają więcej niż jednego bajtu do zapisania w bazie danych.

Jeśli zdefiniujesz pole jako , Oracle może użyć do 11 bajtów do przechowywania, ale możesz nie być w stanie zapisać 11 znaków w polu, ponieważ niektóre z nich wymagają więcej niż jednego bajtu do zapisania, np. znaki spoza alfabetu angielskiego.

Definiując pole jako VARCHAR2(11 CHAR), możesz powiedzieć Oracle, że może użyć wystarczająco dużo miejsca do przechowywania 11 znaków, bez względu na to, ile bajtów potrzeba, aby je zapisać. Pojedyncza postać może wymagać do 4 bajtów.

+44

Należy zauważyć, że semantyka długości znaków nie wpływa na maksymalną długość 4000 bajtów dla 'VARCHAR2'. Zgłoszenie "VARCHAR2 (4000 CHAR)" spowoduje mniej niż 4000 znaków, jeśli niektóre znaki wymagają wielu bajtów pamięci. –

+0

@ David Sykes Czy to jest semantycznie takie samo z NVARCHAR (11)? – Nap

+0

@Nap Nie tak daleko, jak wiem. Uważam, że parametr wielkości w deklaracji typu NVARCHAR ma znaczenie jak w VARCHAR2. tj. aby zapewnić wystarczającą ilość miejsca na 11 znaków (nie bajtów) w zestawie znaków NVARCHAR, powiedziałbyś NVARCHAR (11 CHAR). UWAGA: Nie sprawdziłem tego. Nigdy nie używałem NVARCHAR. –

19

One ma dokładnie przestrzeń dla 11 bajtów, z drugiej przez dokładnie 11 znaków. Niektóre zestawy znaków, takie jak warianty Unicode, mogą wykorzystywać więcej niż jeden bajt na znak, dlatego w polu 11-bajtowym może być miejsce na mniej niż 11 znaków, w zależności od kodowania.

Zobacz także http://www.joelonsoftware.com/articles/Unicode.html

3

nie jestem pewien, ponieważ nie jestem użytkownikiem Oracle, ale zakładam, że różnica leży przy użyciu zestawów znaków wielo-bajtowych, takich jak Unicode (UTF-16/32). W tym przypadku 11 bajtów może zawierać mniej niż 11 znaków.

Te typy pól mogą być traktowane inaczej pod względem znaków akcentowanych lub wielkości liter, na przykład "binaryField (ete) =" été "" nie będzie pasować, podczas gdy 'charField (ete) = "été"' może (znowu nie na pewno o Oracle).

15

W zależności od konfiguracji systemu, wielkość CHAR mierzona jest in bajty mogą się różnić. W twoich przykładów:

  1. Granice pola do 11 BYTE
  2. Granice pola do 11 CHAR acters


Wnioski: 1 CHAR nie jest równa 1 bajt.