Type CHAR et espaces

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.