it-swarm.it

Differenza tra BYTE e CHAR nei tipi di dati di colonna

In Oracle, qual è la differenza tra:

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

e

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)
157
Guido

Supponiamo che il set di caratteri del database sia UTF-8, che è l'impostazione consigliata nelle versioni recenti di Oracle. In questo caso, alcuni caratteri richiedono più di 1 byte per essere archiviati nel database.

Se definisci il campo come VARCHAR2(11 BYTE), Oracle può utilizzare fino a 11 byte per l'archiviazione, ma potresti non essere effettivamente in grado di memorizzare 11 caratteri nel campo, poiché alcuni di essi richiedono più di un byte per l'archiviazione, ad es. personaggi non inglesi.

Definendo il campo come VARCHAR2(11 CHAR) dici a Oracle che può usare abbastanza spazio per memorizzare 11 caratteri, indipendentemente da quanti byte ci vogliono per memorizzare ciascuno. Un singolo carattere può richiedere fino a 4 byte.

249
David Sykes

Uno ha esattamente spazio per 11 byte, l'altro per esattamente 11 caratteri. Alcuni set di caratteri come le varianti Unicode possono utilizzare più di un byte per carattere, pertanto il campo di 11 byte potrebbe avere spazio per meno di 11 caratteri a seconda della codifica.

Vedi anche http://www.joelonsoftware.com/articles/Unicode.html

20

A seconda della configurazione del sistema, la dimensione del CHAR misurata in BYTES può variare. Nei tuoi esempi:

  1. Limita il campo a 11 Personaggi
  2.  



16
user15453

Non sono sicuro poiché non sono un utente Oracle, ma presumo che la differenza risieda quando si utilizzano set di caratteri multi-byte come Unicode (UTF-16/32). In questo caso, 11 byte potrebbero contenere meno di 11 caratteri.

Anche questi tipi di campi potrebbero essere trattati in modo diverso rispetto ai caratteri accentati o al caso, ad esempio 'binaryField (ete) = "été"' non corrisponderà mentre 'charField (ete) = "été"' potrebbe (di nuovo non sono sicuro di Oracle) .

3
Seldaek