Contrairement au type VARCHAR2
, le type CHAR
a une longueur fixe. Pour permettre aux chaines de caractères d’être insérée dans un type CHAR
, même si le nombre de caractères ou octets ne correspond pas, les chaines sont implicitement complétées pas des espaces. L’exemple ci-dessous met en évidence ce fonctionnement avec la valeur par défaut de blank_trimming
:
SQL> show parameter blank_trimming
NAME TYPE VALUE
-------------- ------- ------------------------------
blank_trimming boolean FALSE
SQL> create table x(a char(10),b char(5));
Table created.
SQL> insert into x(a) values ('XXXXX');
1 row created.
SQL> commit;
Commit complete.
Cela dit, si les espaces complètent les chaînes, ils ne sont pas supprimés:
SQL> update x set b=a;
update x set b=a
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."X"."B" (actual: 10, maximum: 5)
Pour changer ce comportement et être compatible avec les niveaux transitionels et supérieur de SQL-92, vous pouvez positionner le paramètre blank_trimming
à true
(il s’agit d’un paramètre statisque) :
alter system set blank_trimming=true scope=spfile;
SQL> startup force;
ORACLE instance started.
Total System Global Area 1065353216 bytes
Fixed Size 1223440 bytes
Variable Size 281019632 bytes
Database Buffers 775946240 bytes
Redo Buffers 7163904 bytes
Database mounted.
Database opened.
SQL> update x set b=a;
1 row updated.
SQL> commit;
Commit complete.
Comme vous pouvez vous en rendre compte, les espaces sont implicitement supprimés dans ce cas:
select '|'||a||'|' a, '|'||b||'|' b
from x;
A B
------------ -------
|XXXXX | |XXXXX|
Intéressant paramètre, même si les effets de bords d’un paramètre positionné au niveau de l’instance sont sans doute plus importants qu’on imagine à priori. L’alternative est une utilisation adéquate des fonctions ltrim
et rtrim
. Vous pouvez supprimer la table pour en terminer avec cet exemple :
SQL> drop table x purge;
Table dropped.