web-dev-qa-db-fra.com

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

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
)
159
Guido

Supposons que le jeu de caractères de la base de données est 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 à stocker 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 nécessitent plus d'un octet, par exemple. caractères non anglais.

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

255
David Sykes

L'un a exactement l'espace pour 11 octets, l'autre 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 aussi http://www.joelonsoftware.com/articles/Unicode.html

20
Matthias Kestenholz

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

  1. Limite le champ à 11 Personnages
  2.  



16
user15453

Je ne suis pas sûr puisque 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 pourraient 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 les majuscules. Par exemple, "binaryField (ete) =" été "" ne correspond pas alors que "charField (ete) =" été "" pourrait (encore ne pas savoir à propos d'Oracle) .

3
Seldaek