UTF8 vs AL32UTF8 (aka UTF-8)

Ça fait plusieurs fois que je vois des bases de données créées avec le jeu de caractère UTF8 au lieu de AL32UTF8 ! Ca mérite quelques commentaires :

  • Vous pouvez pester contre Oracle, mais toujours est-il que la convention de nommage des jeux de caractères est différente des noms des jeux de caractère que l’on utilise en général ; par exemple :
  • Oracle recommande de créer ses bases de données avec le jeu de caractère universel AL32UTF8  – et PAS UTF8 ! On peut lire dans la documentation « At the top of the list of character sets that Oracle recommends for all new system deployment, is the Unicode character set AL32UTF8. »
  • Certaines applications ne supportent pas AL32UTF8 mais seulement UTF8. C’est le cas pour certains modules des applications Oracle mais pas seulement ! Avant de créer votre base de données, prenez bien en compte les pré-requis de vos applications.
  • Le jeu de caractère Oracle UTF8 est une première implémentation de UTF-8 jusqu’à sa ré-écriture en 9i. Les caractères au delà des caractères U+FFFF sont stockés différemment des caractères UTF-8. Cette implémentation, si vous l’utilisez, peut devenir problématique dans le cas d’utilisation de caractères spéciaux et de caractères privés. Ces derniers, par exemple, sont stockés, sur 6 octets en UTF8, contrairement aux caractères UTF-8 qui en utilisent au plus 4 octets. Les clients Oracle ne sont pas capables de traiter les conversion entre ces 2 jeux de caractères. 

Pour plus d’informations, lisez également le glossaire de la documentation et notamment les sections AL32UTF8UTF8 et UTF-8.

Une dernière chose, si les jeux de caractères vous intéressent… Notez bien qu’Oracle ne permet pas d’utiliser AL16UTF16 comme jeu de caractère pour la base de données mais seulement pour les jeux nationaux (NCHAR, NVARCHAR2, NCLOB, …) ; C’est parce que ce jeu de caractère n’est pas un sur-ensemble d’ASCII ni d’EBCDIC et que le dictionnaire de données est créé sans l’un de ces jeux de caractères. Pour preuve, la section CHARACTER SET Clause de la commande CREATE DATABASE dit « Restriction on CHARACTER SET You cannot specify the AL16UTF16 character set as the database character set.« . Voilà !