Oracle
 sql >> Base de données >  >> RDS >> Oracle

Colonne de requête avec le type de données char dans oracle

Le problème est de savoir si vous utilisez char ou varchar2 sémantique de comparaison dans vos requêtes. Si vous avez un littéral de chaîne codé en dur ou un char(10) variable, Oracle utilise le char sémantique de comparaison qui doit ignorer l'espace blanc de fin. Si vous avez un varchar2(10) variable, Oracle utilise le varchar2 sémantique de comparaison qui inclut l'espace blanc de fin. Ainsi

 select aa 
   into v_temp 
   from abc 
  where aa in (v_aa);

renverra une ligne si v_aa est défini comme un char(10) (ou s'il est remplacé par un littéral de chaîne) mais pas s'il est défini comme un varchar(10) .

C'est l'une des (nombreuses) raisons pour lesquelles la plupart des gens évitent char types de données entièrement. Personnellement, les char occasionnels ne me dérangent pas pour des données vraiment à largeur fixe (c'est-à-dire char(1) pour les drapeaux et char(2) pour les codes d'état) même s'il n'y a aucun avantage à utiliser char sur varchar2 dans ces scénarios. Pour tout ce qui n'est pas à largeur fixe, cependant, en utilisant un char ça n'a aucun sens. Vous ne faites qu'obliger Oracle à consommer plus d'espace qu'il n'en a besoin et à créer plus de travail pour vous-même en traitant deux ensembles de sémantiques de comparaison de chaînes (entre autres problèmes).