Différence entre L'octet et le caractère 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
)
4 réponses
Supposons que le jeu de caractères de la base de données est UTF-8, ce qui est le paramètre recommandé dans les versions récentes D'Oracle. Dans ce cas, certains caractères prennent plus de 1 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 prennent plus d'un octet à stocker, par exemple des caractères non anglais.
En définissant le champ comme VARCHAR2(11 CHAR)
vous dites à Oracle il peut utiliser suffisamment d'espace pour stocker 11 caractères, quel que soit le nombre d'octets qu'il faut pour stocker chacun. Un seul caractère peut nécessiter jusqu'à 4 octets.
On a exactement l'espace de 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, donc le champ de 11 octets peut avoir de l'espace pour moins de 11 caractères en fonction de l'encodage.
Voir aussi http://www.joelonsoftware.com/articles/Unicode.html
Selon la configuration du système, la taille de CHAR mesurée en octets peut varier. Dans vos exemples:
- limite le champ à 11 octet
- Limites de champ à 11 CHARacteurs
Conclusion: 1 caractère n'est pas égal à 1 octet.
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 peuvent représenter moins de 11 caractères.
En outre, 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).