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
)
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.
VARCHAR2
. Zadeklarowanie aVARCHAR2(4000 CHAR)
pozwoli na użycie mniej niż 4000 znaków, jeśli niektóre znaki wymagają przechowywania wielu bajtów.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
źródło
W zależności od konfiguracji systemu, rozmiar CHAR mierzony w bajtach może się różnić. W twoich przykładach:
Wniosek: 1 CHAR nie jest równy 1 BYTE.
źródło
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) .
źródło