Différence entre BYTE et CHAR dans les types de données de colonne

166

Dans Oracle, quelle est la différence entre:

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

et

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

Réponses:

265

Supposons que le jeu de caractères de la base de données soit UTF-8, qui est le paramètre recommandé dans les versions récentes d'Oracle. Dans ce cas, certains caractères nécessitent plus d'un octet pour être stockés dans la base de données.

Si vous définissez le champ comme VARCHAR2(11 BYTE), Oracle peut utiliser jusqu'à 11 octets pour le stockage, mais vous ne pourrez peut-être pas stocker 11 caractères dans le champ, car certains d'entre eux prennent plus d'un octet à stocker, par exemple des caractères non anglais.

En définissant le champ comme VARCHAR2(11 CHAR)vous le dites à Oracle, il peut utiliser suffisamment d'espace pour stocker 11 caractères, quel que soit le nombre d'octets nécessaires pour stocker chacun d'eux. Un seul caractère peut nécessiter jusqu'à 4 octets.

David Sykes
la source
55
Notez que la sémantique de la longueur des caractères n'affecte pas la longueur maximale de 4000 octets pour a VARCHAR2. Déclarer a VARCHAR2(4000 CHAR)autorisera moins de 4000 caractères si certains des caractères nécessitent plusieurs octets de stockage.
Justin Cave
@David Sykes Est-ce sémantiquement la même chose avec NVARCHAR (11)?
Nap
@Nap Pas pour autant que je sache. Je crois que le paramètre de taille dans la déclaration de type NVARCHAR a la signification de VARCHAR2. c'est-à-dire que pour garantir un espace de stockage suffisant pour 11 caractères (et non des octets) dans le jeu de caractères NVARCHAR, vous diriez NVARCHAR (11 CHAR). REMARQUE: je n'ai pas vérifié cela. Je n'ai jamais utilisé NVARCHAR.
David Sykes
Pour illustrer davantage la différence entre les deux: quatre caractères d'une valeur hexadécimale (c'est-à-dire «0xFF») ou trois caractères décimaux (c'est-à-dire «255») pourraient être «compressés» lorsqu'ils sont représentés par un seul octet: 11111111. Cela pourrait alors être utile pour les indicateurs de bits (jusqu'à 8 paramètres), les opérations au niveau du bit, etc.
Matt Borja
Notez que 1 en tant que caractère ASCII (déc.49) est 1001001 alors que 1 en tant que bit est 00000001.
Matt Borja
21

L'un a exactement l'espace pour 11 octets, l'autre pour exactement 11 caractères. Certains jeux de caractères tels que les variantes Unicode peuvent utiliser plus d'un octet par caractère, par conséquent, le champ de 11 octets peut avoir de l'espace pour moins de 11 caractères en fonction du codage.

Voir également http://www.joelonsoftware.com/articles/Unicode.html

Matthias Kestenholz
la source
17

En fonction de la configuration du système, la taille de CHAR mesurée en BYTES peut varier. Dans vos exemples:

  1. Limite le champ à 11 BYTE
  2. Limite le champ à 11 acteurs CHAR


Conclusion: 1 CHAR n'est pas égal à 1 BYTE.

utilisateur15453
la source
4

Je ne suis pas sûr car je ne suis pas un utilisateur Oracle, mais je suppose que la différence réside lorsque vous utilisez des jeux de caractères multi-octets tels que Unicode (UTF-16/32). Dans ce cas, 11 octets peuvent représenter moins de 11 caractères.

De plus, ces types de champs peuvent être traités différemment en ce qui concerne les caractères accentués ou la casse, par exemple 'binaryField (ete) = "été"' ne correspondra pas alors que 'charField (ete) = "été"' pourrait (encore une fois pas sûr d'Oracle) .

Seldaek
la source