Oracle datatype: devrais-je utiliser VARCHAR2 ou CHAR

devrais-je utiliser VARCHAR2 ou CHAR comme type de données dans Oracle?

il m'a été suggéré D'utiliser CHAR pour ces nouvelles tables dont j'ai besoin mais je m'inquiète car ces nouvelles tables qui seront utilisées pour populater les tables existantes qui utilisent un type de données VARCHAR2. Je m'inquiète des espaces supplémentaires placés dans les champs VARCHAR2 et des problèmes de comparaison. Je sais qu'il y a des façons de les comparer en les taillant ou en les convertissant, mais j'ai bien peur que cela ne rende mon code confus. et le buggy.

quelles sont vos opinions?

7
demandé sur Elim99 2011-10-13 02:06:58

5 réponses

Je m'inquiète des espaces supplémentaires placés dans les champs VARCHAR2 et des problèmes de comparaison. Je sais qu'il y a des façons de les comparer en les taillant ou en les convertissant, mais j'ai bien peur que cela ne rende mon code confus et bogué.

en fait, c'est tout le contraire. L'utilisation de CHAR va forcer vos cordes à être une longueur fixe en les rembourrant avec des espaces si elles sont trop courtes. Ainsi, lorsque vous comparez des caractères à des chaînes régulières dans quelque application que ce soit en utilisant les données, cette application serait nécessaire d'ajouter une garniture à chaque fois. En d'autres termes, VARCHAR2 est le choix qui conduit naturellement à un code plus propre.

en général, vous devriez toujours utilisez VARCHAR2, à moins que vous ayez une raison très spécifique pour laquelle vous voulez une colonne de CHAR.

si vous êtes inquiet des cordes qui ont des espaces supplémentaires à l'avant ou à l'extrémité, alors il y a quelques options qui viennent à l'esprit:

  • marque quel que soit le procédé utilisé, les inserts doivent être coupés avant d'être insérés.
  • ajouter une contrainte de contrôle sur la colonne qui assure que string = trim (string).
  • Ajouter un déclencheur avant insertion de ligne-niveau qui fait une coupe sur les cordes comme ils sont insérés.
  • assurez-vous que vous faites une coupe sur les cordes chaque fois que vous interrogez la table
9
répondu ivanatpr 2011-10-12 23:35:39

Lire:

citation tirée de L'article D'AskTom:

le fait qu'un CHAR / NCHAR n'est en réalité rien de plus qu'un VARCHAR2 / NVARCHAR2 déguisé me fait penser qu'il y a vraiment seulement deux chaîne de caractères types de considérer, à savoir VARCHAR2 et NVARCHAR2. Je n'ai jamais trouvé d'utilisation pour le type CHAR n'importe quelle application. Depuis un type de CHAR toujours des tampons Vierges le résultat string out à une largeur fixe, nous découvrons rapidement qu'il consomme stockage maximum dans le segment de table et dans tous les segments d'index. Que serait assez mauvais, mais il est une autre raison importante pour éviter Types CHAR/ NCHAR: ils créent de la confusion dans les applications qui ont besoin de récupérer cette information (beaucoup ne peuvent pas "trouver" leurs données après le stockage il.) La raison en est liée aux règles de la chaîne de caractères la comparaison et la rigueur avec laquelle elles sont effectuées.

4
répondu gavenkoa 2013-10-29 07:34:17

CHAR a une sémantique de comparaison intéressante. Si vous utilisez seulement VARCHAR2, alors vous n'avez pas besoin d'apprendre la sémantique. Honnêtement, je pense que si j'avais un domaine avec un lenth fixe connu, je le définirais encore comme un VARCHAR2 et utiliser une contrainte de contrôle pour faire respecter sa longueur fixe, au lieu d'apprendre la sémantique de comparaison de CHAR.

certains soutiendront que les CHARs sont plus efficaces pour les données de longueur fixe parce que la longueur n'a pas besoin d'être stocké, mais qui est faux sur Oracle .

3
répondu Shannon Severance 2011-10-12 23:12:39

je vous suggère de vous en tenir à VARCHAR2.

vous devez utiliser CHAR lorsque les données sont une longueur fixe connue.

0
répondu Rajeev Shenoy 2011-10-12 22:09:45

choisir VARCHAR2(size) au lieu de CHAR(size) , car c'est plus efficace en termes d'espace et de temps:

de façon surprenante ou non, CHAR(size) permet l'assignation de cordes d'une longueur len plus courte que size . Dans ce cas, ORACLE Ajoute les espaces size-len à la chaîne de caractères pour les types de données CHAR et VARCHAR et stocke les caractères size . Le type de données VARCHAR2 est fourni sans capitonnage, seuls les caractères len sont stockés.

CREATE TABLE Demo(col1 CHAR(4), col2 VARCHAR2(4));
INSERT INTO Demo (col1, col2) VALUES ('c', 'v');

résultat,

col1='c ' (rembourré avec 3 espaces de fuite, puisque le size de col1 est 4 et la longueur de 'c' est seulement 1). col1='c' évalue faux, seulement TRIM(col1)='c' évalue vrai,

attendu que

col2='v' évalue TRUE sans TRIM() , ce qui rend la comparaison plus efficace.

De plus, les comparaisons entre deux valeurs VARCHAR2 échouent rapidement si leurs longueurs diffèrent (indépendamment de leur size ). Dans ce cas, aucun caractère sage comparaisons sont nécessaires. Avec CHAR et même size , le contrôle de longueur échoue toujours à cause du rembourrage. Ainsi, chaque caractère doit être comparé jusqu'à ce que la première inadéquation de caractère ou la fin de la chaîne de caractères ait été atteinte, selon ce qui se produit en premier.

puisque CHAR(size) et VARCHAR2(size) ne empêcher les assignations de valeurs plus courtes que size , définir une contrainte de longueur si vous avez besoin de s'assurer que seules les valeurs avec une longueur prédéfinie (qui devrait être égale size ) peut être assignée.

0
répondu Volker Weber 2016-04-05 13:32:32