Różnica między BYTE i CHAR w typach danych kolumn

166

Jaka jest różnica między w Oracle:

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

i

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)
Guido
źródło

Odpowiedzi:

265

Załóżmy, że zestaw znaków bazy danych to UTF-8, co jest zalecanym ustawieniem w najnowszych wersjach Oracle. W takim przypadku przechowywanie w bazie danych niektórych znaków zajmuje więcej niż 1 bajt.

Jeśli zdefiniujesz pole jako VARCHAR2(11 BYTE), Oracle może wykorzystać do 11 bajtów do przechowywania, ale w rzeczywistości możesz nie być w stanie przechowywać 11 znaków w polu, ponieważ niektóre z nich zajmują więcej niż jeden bajt, np. Znaki inne niż angielskie.

Definiując pole zgodnie z instrukcjami VARCHAR2(11 CHAR)Oracle, może wykorzystać wystarczająco dużo miejsca na przechowywanie 11 znaków, niezależnie od liczby bajtów potrzebnych do przechowywania każdego z nich. Pojedynczy znak może wymagać do 4 bajtów.

David Sykes
źródło
55
Należy zauważyć, że semantyka długości znaków nie wpływa na maksymalną długość 4000 bajtów dla pliku VARCHAR2. Zadeklarowanie a VARCHAR2(4000 CHAR)pozwoli na użycie mniej niż 4000 znaków, jeśli niektóre znaki wymagają przechowywania wielu bajtów.
Justin Cave,
@David Sykes Czy to semantycznie to samo z NVARCHAR (11)?
Drzemka
@Nap Nie o ile wiem. Uważam, że parametr rozmiaru w deklaracji typu NVARCHAR ma znaczenie jak w VARCHAR2. tzn. aby zapewnić wystarczającą ilość miejsca na 11 znaków (nie bajtów) w zestawie znaków NVARCHAR, powiedziałbyś NVARCHAR (11 CHAR). UWAGA: tak naprawdę tego nie sprawdzałem. Nigdy nie używałem NVARCHAR.
David Sykes,
Aby dokładniej zilustrować różnicę między tymi dwoma: cztery znaki wartości zakodowanej szesnastkowo (tj. „0xFF”) lub trzy znaki dziesiętne (tj. „255”) mogą być „skompresowane”, gdy są reprezentowane jako jeden bajt: 11111111. To mogłoby wtedy być przydatne do flag bitowych (do 8 ustawień), operacji bitowych itp.
Matt Borja,
Zauważ, że 1 jako znak ASCII (dec. 49) to 1001001, podczas gdy 1 jako bit to 00000001.
Matt Borja,
21

Jeden ma dokładnie miejsce na 11 bajtów, a drugi dokładnie na 11 znaków. Niektóre zestawy znaków, takie jak warianty Unicode, mogą wykorzystywać więcej niż jeden bajt na znak, dlatego 11-bajtowe pole może mieć miejsce na mniej niż 11 znaków w zależności od kodowania.

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

Matthias Kestenholz
źródło
17

W zależności od konfiguracji systemu, rozmiar CHAR mierzony w bajtach może się różnić. W twoich przykładach:

  1. Pole ogranicza do 11 BYTE
  2. Ogranicza pole do 11 aktorów CHAR


Wniosek: 1 CHAR nie jest równy 1 BYTE.

user15453
źródło
4

Nie jestem pewien, ponieważ nie jestem użytkownikiem Oracle, ale zakładam, że różnica polega na używaniu zestawów znaków wielobajtowych, takich jak Unicode (UTF-16/32). W tym przypadku 11 bajtów może zawierać mniej niż 11 znaków.

Również te typy pól mogą być traktowane inaczej w odniesieniu do 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 mam pewności co do Oracle) .

Seldaek
źródło