178 votes

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
)

y

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

283voto

David Sykes Points 3027

Supposons que le jeu de caractères de la base de données soit UTF-8, ce 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 il se peut que vous ne puissiez pas réellement stocker 11 caractères dans le champ, car certains d'entre eux nécessitent plus d'un octet pour être stockés, par exemple les caractères non anglais.

En définissant le champ comme VARCHAR2(11 CHAR) vous dites à Oracle qu'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.

57 votes

Notez que la sémantique de la longueur des caractères n'a pas d'incidence sur la longueur maximale de 4000 octets d'un fichier VARCHAR2 . Déclarer un VARCHAR2(4000 CHAR) autorisera moins de 4000 caractères si certains d'entre eux nécessitent plusieurs octets de stockage.

0 votes

@David Sykes Est-ce sémantiquement la même chose avec NVARCHAR(11) ?

0 votes

@Nap Pas à ma connaissance. Je pense que le paramètre size dans la déclaration du type NVARCHAR a la même signification que dans VARCHAR2. Par exemple, 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é ce point. Je n'ai jamais utilisé NVARCHAR.

23voto

L'un a exactement l'espace pour 11 octets, l'autre pour exactement 11 caractères. Certains jeux de caractères, comme les variantes d'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 selon le codage.

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

17voto

user15453 Points 291

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

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

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

4voto

Seldaek Points 12311

Je n'en suis pas sûr puisque je ne suis pas un utilisateur d'Oracle, mais je suppose que la différence réside dans l'utilisation de jeux de caractères multi-octets tels qu'Unicode (UTF-16/32). Dans ce cas, 11 octets pourraient représenter moins de 11 caractères.

Il se peut également que ces types de champ soient 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 le faire (là encore, je ne suis pas sûr pour Oracle).

0voto

ja. Points 2989

Quelle version d'oracle ? En général, un caractère peut prendre plus d'un octet, Google pour l'unicode. Voici un début :

http://www.oracle.com/technology/oramag/oracle/03-nov/o63tech_glob.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X