Problématique encoding : Traiter les données en provenance de tables SGBD, via un module SAS/Access

Commençons par expliquer le principe : Nous avons une base de données ( Oracle, Netezza, Mysql... ) installée sur une serveur et, en "face" un client. Le client de cette base de donnée se charge de convertir les données (transcoder le cas échéant) en provenance du serveur. La page de code est un standard informatique qui vise à donner un numéro à chaque caractère d'une langue.  La page de code permet d’identifier 256 caractères différents. Compte tenu de la diversité des caractères utilisés d’une langue à l’autre, il existe des nombreuses pages de code. Il est important que, l'encoding de la Session SAS soit le même que l'encoding du client de la bas de données. Le client convertit toutes les données  dans le jeux de codes du terminal pour les afficher. Si les caractères sélectionnés n'existent pas dans le jeu de codes du terminal, le système affiche un point d'interrogation.  Le transcodage des données entre l'encoding du serveur de base de données et l'encoding du client est souvent déterminé par la configuration local du serveur où le client est installé. Toutefois, certains client utilisent leurs propres variables d'environnements qui doivent être configuré. Il est donc important que le serveur  connaisse l'encoding du client.   Aussi, chaque client propose sa variable d'environnement qui doit être configuré coté client. Cet variable assure le transcoding depuis l'encoding de la base vers l''encoding de client.  
Base de données Variable d’environnement à positionner côté client Exemple
DB2 DB2CODEPAGE DB2CODEPAGE=1208
Informix CLIENT_LOCALE CLIENT_LOCALE=zh_en.UTF8
Microsoft SQl Server IANAAppCodePage IANAAppCodePage=106
Mysql character_set_client Set character_set_client=utf-8
Netezza LANG Set LANG=fr_FR.iso885915
Oracle NLS_LANG NLS_LANG=American_America.UTF8
PostgreSQL PGCLIENTENCODING PGCLIENTENCODING=UTF8
Sybase Locale Locale=default, us_english, utf8
Teradata charset_idcharset_type charset_id=UTF8charset_type=N
Vertica Pas d'optionSAS/ACCESS va transcoder de façon automatique
Source : https://support.sas.com/resources/papers/Multilingual_Computing_with_SAS_94.pdf

Prenons un exemple avec le module SAS/Access to Netezza :

   

Vérification de l’encoding de la base de données

./nzsql -host <serveur base de donnée> -u <utilisateur> -pw <mot de passe> -d <nom de la base> -s <nom du schéma>
show nz_encoding
 
NOTICE: ISO8859-1
  La norme ISO 8859-1, dont le nom complet est ISO/CEI 8859-1, définit ce qu'elle appelle l'alphabet latin numéro 1, qui consiste en 191 caractères de l'alphabet latin, chacun d'entre eux étant codé par un octet (soit 8 bits). ISO 8859-1 reprend le codage des caractères imprimables d'US-ASCII. iso 8859-1

Vérification de l’encoding du client :

 Lorsque vous démarrez une session SQL Netezza, le système vérifie l'environnement. Il vérifie la valeur définie pour le jeu des codes des paramètres régionaux de la fenêtre de terminal dans laquelle la commande nzsql est appelée. Pour afficher la valeur du jeu de codes des paramètres régionaux, utilisez la commande Linux locale charmap.
locale charmap
ISO8859-1
Vérifions dans  nzsql :
show client_encoding;
NOTICE:  Current client encoding is LATIN9
Nous pouvons afficher le contenu d’une table avec des caractères accentués :
select * from nfilms;
L’affichage est correct : sas nz sql Il faut maintenant positionner l’option LANG dans le fichier sasenv_local de SAS :
 LANG=fr_FR.iso885915
export LANG
Dans SAS, nous vérifions maintenant les options NLS (National Language Support  abrégé par i18n )
PROC Options group = LanguageControl;
run;
ENCODING=LATIN9
LOCALE=FR_FR
Sas est bien configuré en LATIN9

Vérifions la bonne prise en compte de la variable  LANG :

 %put %quote(%sysget(LANG));
 LATIN9
Nous pouvons également exécuter la requête suivant pour vérifier l’encoding du client :
proc sql;
connect to netezza (DATABASE=xxx SERVER=xxx USER=xxx PASSWORD=xxxx);
execute(show client_encoding;) by netezza;
disconnect from netezza;
quit;
WARNING: During execute: NOTICE:  Current client encoding is LATIN9
Le code suivant permet de vérifier le bon affichage de caractères :
options sastrace='d' sastraceloc=saslog nostsuffix;
data _null_;
set NTZ.films;
put title = title $HEX40.;
run;
NETEZZA: EXIT SQLExecute with return code 0 (SQL_SUCCESS)
0x00000000132018b0
NETEZZA: ENTER SQLFetchScroll
0x00000000132018b0
1 <SQL_FETCH_NEXT>
NETEZZA: EXIT SQLFetchScroll with return code 0 (SQL_SUCCESS)
0x00000000132018b0
1 <SQL_FETCH_NEXT>
TITLE=Titanic 546974616E696320202020202020202020202020
TITLE=il était une fois dans l ouest 696C20E97461697420756E6520666F6973206461
TITLE=Bananas 42616E616E617320202020202020202020202020
TITLE=Rocky 526F636B79202020202020202020202020202020
NETEZZA: ENTER SQLFetchScroll 0x00000000132018b0
<SQL_FETCH_NEXT>
 

Puis vérification :

proc print data=NTZ.films;
run;
check in sas

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.