Page 1 sur 1

Decodage Base64 en SQL

Posté : mar. 12 oct. 2021, 09:57:07
par PBL
Bonjour,

Afin de gérer des tokens d'un webservice, nous souhaitons utiliser l'encodage/décodage en base 64 via SQL.
Cependant, lors du décodage, nous ne retrouvons pas la valeur initiale :
1. Encodage :
values systools.base64encode(Cast('toto' as varchar(20) ccsid 1208));
=> Résultat : 'dG90bw=='
2. Décodage
values systools.base64decode('dG90bw==');
=> Résultat : È?È? au lieu de ‘toto’
Nous avons essayé de CASTer la variable retour avec CCSID 297 : pas de changement.
Ce doit être tout simple, mais bon !!!

Merci pour votre aide

Re: Decodage Base64 en SQL

Posté : mar. 12 oct. 2021, 10:05:48
par SebastienB
Bonjour,

voici mon test :
CHGJOB CCSID(1147)
values systools.base64encode('toto') => "o5ajlg=="
values systools.base64decode('o5ajlg==') => "toto"

J'ai aussi essayé avec le CCSID 297. Pas de soucis.

Séb.

Re: Decodage Base64 en SQL

Posté : mar. 12 oct. 2021, 10:14:10
par PBL
Bonjour,
Oui, cela fonctionne dans ce cas, mais notre problématique vient de la chaîne d'origine qui est en UTF-8 (et encodé en base 64 avec ccsid 1208).
Lors du décodage, on ne retombe pas sur la valeur d'origine. J'ai l'impression qu'il nous manque un paramètre de conversion de ccsid lors du décodage, mais nous n'avons pas trouvé la solution.

Re: Decodage Base64 en SQL

Posté : mar. 12 oct. 2021, 12:53:40
par nbonnet
Bonjour,

ce phénomène est normal, même s'il est difficile à manipuler en SQL. L'encodage en base64 permet d'exprimer une valeur binaire sous forme de caractères.

La fonction base64decode prend en argument une chaine de caractères UTF-8 et renvoie un varchar for bit data (autrement dit en CCSID 65535). Cette valeur de retour ne peut donc pas être affichée sous forme de caractères dans le bon encodage, c'est la valeur hexa/binaire qui est importante.

https://www.ibm.com/docs/en/i/7.4?topic ... r-function
https://www.ibm.com/docs/en/i/7.4?topic ... r-function

On a par ailleurs le même phénomène avec les nouvelles fonctions de QSYS2.

Le bon usage est bien celui-ci :

Code : Tout sélectionner

values systools.base64encode(Cast('toto' as varchar(20) ccsid 1208));
Il procure la même valeur que ce que l'on peut trouver en ligne : https://base64.guru/converter/encode