Question

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
)
Était-ce utile?

La solution

Supposons que le jeu de caractères de la base de données est UTF-8, 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 leur prend plus d’un octet à stocker, 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 à leur stockage. Un seul caractère peut nécessiter jusqu'à 4 octets.

Autres conseils

L’un a exactement 11 octets pour l’espace, l’autre pour 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 contenir moins de 11 caractères, en fonction du codage.

Voir aussi http://www.joelonsoftware.com/articles/Unicode.html

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 BYTE
  2. Limite le champ à 11 CHAR acteurs


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

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.

Ces types de champs peuvent également être traités différemment en ce qui concerne les caractères accentués ou les majuscules, par exemple 'binaryField (ete) = "& # 233; t & # 233;" ne correspondra pas tant que 'charField (ete) = "& # 233; t & # 233;" pourrait (encore une fois pas sûr sur Oracle).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top