O client do DB2 no Linux utiliza a configuração de locale do sistema operacional para fazer a conexão com o SGBD e para fazer as conversões de caracteres entre os dois. Para que as operações de inserção e/ou atualização de campos caractere funcionem corretamente com caracteres especiais é necessário que a variável de ambiente LC_CTYPE esteja alinhada com o codepage do SGBD. Essa variável é responsável pelo codepage de strings no Linux.
No exemplo abaixo o SGBD está configurado com codepage 1252, mas o LC_CTYPE da máquina em que está o DBAccess está como UTF-8.
Conexão do DBAccess com o DB2, mostrando as configurações do banco acessado:
... 15/05/2018 16:46:54 : [INFO] Connection [DB2/TEC2012-DB2] using client library [/usr/lib64/libodbc.so] (ODBC10) 15/05/2018 16:46:54 : --------------- Initial Connection Check-Up --------------- Database......: DB2 Environment...: TEC2012-DB2 TableSpace....: IndexSpace....: Compression ..: NONE logfilsiz ...: 1024 logprimary ...: 13 logsecond ...: 12 codepage ...: 1252 codeset ...: IBM-1252 collate_in ...: DBMS Isolation ...: ----------------------------------------------------------- ...
Configuração de locale na máquina do DBAccess:
tec-db-linux:~ # locale LANG=POSIX LC_CTYPE=en_US.UTF-8 LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL= tec-db-linux:~ #
Caso haja essa diferença de configuração, caso seja feito a inserção de caracteres especiais num campo caractere ou memo, a inserção colocará caracteres diferentes e mostrará uma mensagem de warning (se habilitado as chaves DBWarings e MsgWarnings) da forma:
Warning : 0 (01517) (RC=1) - [IBM][CLI Driver][DB2/NT64] SQLSTATE 01517: A character that could not be converted was replaced with a substitute character.
Para corrigir essa situação deve-se colocar a variável de ambiente LC_CTYPE no mesmo codepage do banco (no caso 1252):
export LC_CTYPE=POSIX