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
)

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.


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,


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.


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) .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.