Decodage Base64 en SQL

RPG (3 et 4, free), CL, SQL, etc...
Répondre
PBL
Messages : 16
Enregistré le : ven. 22 nov. 2019, 15:20:16

Decodage Base64 en SQL

Message 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

SebastienB
Messages : 51
Enregistré le : ven. 22 janv. 2021, 10:21:13

Re: Decodage Base64 en SQL

Message 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.

PBL
Messages : 16
Enregistré le : ven. 22 nov. 2019, 15:20:16

Re: Decodage Base64 en SQL

Message 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.

nbonnet
Messages : 198
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: Decodage Base64 en SQL

Message 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
Nathanaël

Répondre