web-dev-qa-db-fra.com

Quelle est la difference majeure entre Varchar2 et char

Création de table:

CREATE TABLE test (
charcol    CHAR(10),
varcharcol VARCHAR2(10));

SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;

Résultat:

LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
             10                  1 

S'il vous plaît, laissez-moi savoir quelle est la différence entre Varchar2 et char? À quel moment utilisons-nous les deux?

18
ram12393

Exemple simple pour montrer la différence:

SELECT 
    '"'||CAST('abc' AS VARCHAR2(10))||'"', 
    '"'||CAST('abc' AS CHAR(10))||'"' 
FROM dual;


'"'||CAST('ABC'ASVARCHAR2(10))||'"' '"'||CAST('ABC'ASCHAR(10))||'"'
----------------------------------- -------------------------------
"abc"                               "abc       "                   
1 row selected.

CHAR est utile pour les expressions où la longueur des caractères est toujours fixe, par exemple. code postal pour les états américains, par exemple CA, NY, FL, TX

18

C’est un vieux fil de discussion, mais il vient tout juste de déboucher sur une recherche Google pour 'Oracle char vs varchar2', et même s’il existe déjà plusieurs réponses décrivant correctement le comportement de char, je pense qu’il faut dire que vous ne devrait pas l'utiliser sauf dans deux situations spécifiques:

  1. Vous construisez un fichier ou un rapport de longueur fixe et attribuez une valeur non nulle à une variable char évite de coder une expression rpad(). Par exemple, si firstname et lastname sont tous deux définis comme étant char(20), alors firstname || lastname est une méthode plus courte d’écriture de rpad(firstname,20) || rpad(lastname,20).
  2. Vous devez faire la distinction entre la chaîne vide explicite '' et null. Normalement, c'est la même chose dans Oracle, mais assigner '' à une valeur char déclenchera son comportement de remplissage des blancs, alors que null ne le fera pas, donc s'il est important de faire la différence, je ne peux vraiment pas penser à la raison être, alors vous avez un moyen de le faire.

Il y a vraiment aucune raison d'utiliser char simplement parce qu'une longueur est fixée (par exemple, un drapeau Y/N ou un code de devise ISO tel que 'USD'). Ce n'est pas plus efficace, cela ne permet pas d'économiser de la place (il n'y a pas d'indicateur de longueur mythique pour un varchar2, il y a juste une surcharge de remplissage vierge pour char), et cela n'empêche personne d'entrer des valeurs plus courtes. (Si vous entrez 'ZZ' dans votre colonne char(3) devise, celle-ci sera simplement stockée sous la forme 'ZZ '.) Il n'est même pas rétrocompatible avec une version ancienne d'Oracle qui en reposait autrefois, car il n'y en a jamais eu.

Et la contagion peut se propager car (selon les meilleures pratiques), vous pouvez ancrer une déclaration de variable en utilisant quelque chose comme sales.currency%type. Désormais, votre variable l_sale_currency est une variable furtive char qui se remplira de manière invisible pour les valeurs plus courtes (ou ''), ouvrant ainsi la porte à l'obscurcissement de bogues où l_sale_currency n'est pas égal à l_refund_currency même si vous leur avez attribué 'ZZ'.

CHAR a été introduit dans Oracle 6 pour des raisons de compatibilité ANSI, j'en suis sûr. Il y a probablement des clients potentiels qui décident du produit de base de données à acheter et la compatibilité ANSI figure dans leur liste de contrôle (ou était utilisée à l'époque), et CHAR avec des espaces est défini dans le standard ANSI. Oracle doit donc le fournir. . Vous n'êtes pas censé l'utiliser réellement.

17
William Robertson

CHARtype a une taille fixe, donc si vous dites qu'il est de 10 octets, il stocke toujours 10 octets dans la base de données et que vous stockiez du texte ou vider 10 octets n'importe pas

VARCHAR2 taille dépend du nombre d'octets que vous allez réellement stocker dans la base de données. Le nombre que vous spécifiez est simplement le nombre maximal d'octets pouvant être stockés (bien qu'un octet soit le minimum)

Vous devez utiliser CHAR lorsque vous traitez avec des chaînes de longueur fixe (vous savez à l'avance la longueur exacte de la chaîne que vous allez stocker) - la base de données peut alors être manipulée mieux et plus rapidement car elle connaît la longueur exacte.

Vous devez utiliser VARCHAR2 lorsque vous ne connaissez pas la longueur exacte des chaînes stockées.

La situation que vous utiliseriez peut être:

name VARCHAR2(255),
Zip_code CHAR(5) --if your users have only 5 place Zip codes
4
Wolf

Juste pour éviter la confusion sur beaucoup d'informations fausses. Voici quelques informations sur la différence, y compris les performances

Référence: https://asktom.Oracle.com/pls/asktom/f?p=100:11::::::P11_QUESTION_ID:2668391900346844476

Puisqu'un caractère n'est rien de plus qu'un VARCHAR2 qui est rempli de blancs à la longueur maximale - c’est-à-dire la différence entre les colonnes X et Y ci-dessous: 

créer une table t (x varchar2 (30), y char (30)); insérer dans t (x, y) valeurs (rpad ('a', '', 30), 'a'); 

N'EST ABSOLUMENT RIEN, et étant donné que la différence entre les colonnes X et Y ci-dessous: 

insérer dans t (x, y) des valeurs ('a', 'a') 

est que X consomme 3 octets (indicateur nul, longueur de l'octet de tête, 1 octet pour 'a') et Y utilise 32 octets (indicateur nul, longueur de l'octet longueur, 30 octets pour 'a') 

Umm, varchar2 va être un peu "à un avantage de performance Sage". Cela ne nous aide PAS AT TOUT que le caractère (30) soit toujours de 30 octets - à Pour nous, il s’agit simplement d’une variable varchar2 dont le blanc est complété au maximum longueur. Cela nous aide dans le traitement - ZERO, zilch, zippo. 

Chaque fois que vous voyez quelqu'un dire "c'est 50% plus rapide", et c'est tout. pas d’exemple, pas de science, pas de faits, pas d’histoire pour le confirmer - il suffit de rire à haute voix à eux et continuer à avancer. 

Il y a aussi d'autres "choses inventées" sur cette page, par exemple: 

"La recherche est plus rapide dans CHAR car toutes les chaînes sont stockées à une position spécifiée, Le système n'a pas besoin dePour rechercher la fin de la chaîne. sous VARCHAR, le système doitd'abord trouver la fin de la chaîne, puis lancer la recherche. "

FALSE: un caractère est juste un blanc varchar2 rempli - nous ne stockons pas chaînes "à une position spécifiée les unes des autres". Nous recherchons la fin de la chaîne - nous utilisons un octet de longueur pour représenter les choses en dehors.

3
Anddo

CHAR

CHAR devrait être utilisé pour stocker des chaînes de caractères de longueur fixe. Les valeurs de chaîne seront espace/espace vierge avant d'être stockées sur le disque. Si ce type est utilisé pour stocker des chaînes de longueur varibale, cela gaspille beaucoup d’espace disque.

VARCHAR2

VARCHAR2 est utilisé pour stocker des chaînes de caractères de longueur variable. La longueur de la valeur de chaîne sera stockée sur le disque avec la valeur elle-même.

Et

At what times we use both?

Tout dépend de vos besoins.

2
Shree

CHARest utilisé pour stocker des chaînes de caractères de longueur fixe. Cela gaspille beaucoup d’espace disque si ce type est utilisé pour stocker des chaînes de longueur varibale.

VARCHAR2 est utilisé pour stocker des chaînes de caractères de longueur variable. 

À quels moments utilise-t-on les deux?

Cela peut varier et dépend de vos besoins.

MODIFIER:-

Permet de comprendre cela avec un exemple, si vous avez une colonne de nom d’étudiant de taille 10; sname CHAR(10) et Si une valeur de colonne 'RAMA' est insérée, 6 espaces vides seront insérés à droite de la valeur. S'il s'agissait d'une colonne VARCHAR; sname VARCHAR2(10). Ensuite, Varchar prendra 4 espaces sur 10 possibles et libérera les 6 suivants pour un autre usage. 

0
Rahul Tripathi