Różnica między bajtem a znakiem w typach danych kolumn

W Oracle, jaka jest różnica między:

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
)
Author: emaillenin, 2008-09-17

4 answers

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

Jeśli zdefiniujesz pole jako VARCHAR2(11 BYTE), Oracle może użyć do 11 bajtów do przechowywania, ale możesz nie być w stanie zapisać 11 znaków w tym polu, ponieważ niektóre z nich zajmują więcej niż jeden bajt do przechowywania, np. znaki nieanglojęzyczne.

Definiując pole jako VARCHAR2(11 CHAR) mówisz Oracle może użyć wystarczającej ilości miejsca do przechowywania 11 znaków, bez względu na to, ile bajtów potrzeba do przechowywania każdego z nich. Pojedynczy znak może wymagać do 4 bajtów.

 233
Author: David Sykes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-09 06:38:52

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

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

 19
Author: Matthias Kestenholz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 09:37:02

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

  1. ogranicza pole do 11 bajtów
  2. ogranicza pole do 11 CHAR acters


Wniosek: 1 znak nie jest równy 1 BAJTOWI.

 15
Author: user15453,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 10:13:00

Nie jestem pewien, ponieważ nie jestem użytkownikiem Oracle, ale zakładam, że różnica polega na używaniu wielobajtowych zestawów znaków, 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 (ponownie nie być pewien Oracle).

 3
Author: Seldaek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 09:31:25