Differenza tra BYTE e CHAR nei tipi di dati di colonna


166

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
)

Risposte:


265

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 si definisce il campo come VARCHAR2(11 BYTE), Oracle può utilizzare fino a 11 byte per l'archiviazione, ma potrebbe non essere possibile archiviare 11 caratteri nel campo, poiché alcuni di essi richiedono più di un byte per l'archiviazione, ad esempio caratteri non inglesi.

Definendo il campo quando VARCHAR2(11 CHAR)si dice a Oracle che può utilizzare abbastanza spazio per memorizzare 11 caratteri, indipendentemente da quanti byte siano necessari per memorizzare ciascuno. Un singolo carattere può richiedere fino a 4 byte.


55
Si noti che la semantica della lunghezza dei caratteri non influisce sulla lunghezza massima di 4000 byte per a VARCHAR2. La dichiarazione di a VARCHAR2(4000 CHAR)consentirà meno di 4000 caratteri se alcuni dei caratteri richiedono più byte di memoria.
Justin Cave,

@David Sykes È semanticamente lo stesso con NVARCHAR (11)?
Nap

@Nap Non per quanto ne so. Credo che il parametro size nella dichiarazione del tipo NVARCHAR abbia il significato di VARCHAR2. vale a dire per garantire spazio sufficiente per 11 caratteri (non byte) nel set di caratteri NVARCHAR, si direbbe NVARCHAR (11 CHAR). NOTA: non ho verificato questo. Non ho mai usato NVARCHAR.
David Sykes,

Per illustrare ulteriormente la differenza tra i due: quattro caratteri di un valore con codifica esadecimale (ovvero "0xFF") o tre caratteri decimali (ovvero "255") potrebbero essere "compressi" se rappresentati come un singolo byte: 11111111. Questo potrebbe quindi essere utile per bit flag (fino a 8 impostazioni), operazioni bit per bit, ecc.
Matt Borja

Si noti che 1 come carattere ASCII (dec. 49) è 1001001 mentre 1 come bit è 00000001.
Matt Borja


17

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

  1. Limita il campo a 11 BYTE
  2. Limita il campo a 11 caratteri CHAR


Conclusione: 1 CHAR non è uguale a 1 BYTE.


4

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.