Problemi di codifica durante connessione ODBC a iSeries

odbc-icon-13481La connessione ODBC verso iSeries a volte può dare dei problemi relativi ad una non corretta interpretazione della codifica utilizzata nella tabella sorgente. In questi casi, il driver ODBC di IBM può cominciare a comportarsi in modo imprevedibile, dando errori di esaurimento memoria o addirittura dei segmentation fault.
Nel mio caso sono riuscito a risolvere il problema, specificando all’interno del file di configurazione presente in /etc/odbc.ini l’esatta codifica utilizzata dalla connessione, specificando il CCSID appropriato:


[AS400_CONNECTION]
Description = iSeries Access ODBC Driver
Driver = IBM i Access ODBC Driver
System = 192.168.0.1
Naming = 0
DefaultLibraries = XXX_DAT,XXX_OBJ,QGPL
Database =
ConnectionType = 0
CommitMode = 2
ExtendedDynamic = 1
DefaultPkgLibrary = QGPL
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 1
LibraryView = 0
AllowUnsupportedChar = 0
ForceTranslation = 0
Trace = 0
CCSID = 280

Il CCSID corrisponde alla codifica IBM280 secondo le tabelle di conversione di iconv. Per recuperare la stringa in formato UTF-8 è quindi necessario fare una ulteriore conversione, mediante il comando iconv:

$db_conn = odbc_connect("AS400_CONNECTION",ODBC_USER,ODBC_PWD);	
$resquery = odbc_exec($db_conn,"select * from table");
while ($ro = odbc_fetch_array($resquery )) 
{
      $stringa = iconv("IBM280","UTF-8", $ro['SHIPTNT'])
}

A questo punto otterrete la variabile con il valore corretto, senza rischiare problemi di segmentation fault.

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...