Esse artigo faz parte da revista Clube Delphi edição 47. Clique aqui para ler todos os artigos desta edição

Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML. 

 

Top-15 do InterBase/Firebird

Dúvidas mais freqüentes e suas soluções

Sendo o mantenedor de uma das maiores listas de discussão sobre InterBase/ Firebird  de todo o mundo (www.firebase.com.br), sempre vejo surgirem dúvidas que se repetem com freqüência. Organizei neste artigo as 15 mais comuns entre os usuários de IB/FB, para ajudar os que estão começando a resolver, seus problemas, ou mesmo aqueles que têm uma certa intimidade com esses bancos de dados.

1) Como utilizar caracteres acentuados?

Devemos fazer uso dos charsets e collates disponíveis no IB/FB. São eles que permitem ao administrador do banco de dados (DBA) indicar ao banco quais os caracteres que serão aceitos nos campos alfanuméricos, tanto globalmente (em nível de BD) ou individualmente para cada campo.

São dois os charsets indicados para utilização com o português: ISO8859_1 e WIN1252. Não se engane com este último, apesar do nome sugerir que seja um charset para Windows, ele está disponível em todas as versões do IB/FB para todos os sistemas operacionais suportados – inclusive o Linux. Cada charset possui um conjunto de collates, os quais dizem ao BD como deve comparar os caracteres ou realizar uma ordenação. Ou seja, o collate determina como as palavras “Joao” e “João”, por exemplo, serão ordenadas ou comparadas entre si.

Para o charset ISO8859_1, devemos utilizar o collate PT_PT; já para o charset WIN1252 devemos utilizar o PXW_INTL850. Sempre recomendo o uso deste último par (WIN1252/PXW_INTL850) pois o collate PT_PT tem certos efeitos indesejados na ordenação: ele desconsidera os espaços em branco, fazendo com que algumas ordenações fiquem um tanto quanto “esquisitas”.

O charset pode ser definido globalmente para todo o banco indicando-o durante a criação do BD, como no exemplo a seguir:

 

CREATE DATABASE 'c:\banco.fdb'

USER 'SYSDBA' PASSWORD 'masterkey'

PAGE_SIZE 4096

DEFAULT CHARACTER SET WIN1252;

 

Ou pode ser definido em cada campo, por exemplo:

 

CREATE TABLE TABELA(

  CAMPO1 VARCHAR(10) CHARACTER SET WIN1252 COLLATE PXW_INTL850,

  CAMPO2 VARCHAR(10) CHARACTER SET ISO8859_1 COLLATE PT_PT);

2) Por que obtenho o erro "arithmetic exception, numeric overflow, or string truncation"?

Esse erro está, na maioria das vezes, associado ao item anterior (caracteres acentuados). Quando você especifica um charset durante a criação do banco de dados, deverá indicá-lo também ao fazer a conexão, caso contrário obterá esse erro sempre que tentar utilizar caracteres “especiais”, tais como letras acentuadas.

O método para a definição do charset durante a conexão depende do componente que você está utilizando e é geralmente feito através da configuração de propriedades ou parâmetros (no caso do dbExpress, utilize a propriedade Params do componente SQLConnection).

Note que essa não é a única razão para que o erro ocorra. Infelizmente essa mensagem de erro é muito genérica e pode também indicar o estouro de espaço quando você tenta gravar um string com tamanho maior do que o definido em um campo ou variável; ou então o estouro do limite de armazenamento de algum tipo numérico. Portanto é importante verificar qual dessas possibilidades é a mais provável dependendo da operação que estava sendo executada no momento em que o erro foi gerado.

No exemplo que acompanha este artigo mostro como gerar esse erro, provocando-o através da inserção de um string com caracteres acentuados em um banco onde não foi definido o charset da conexão. A Figura 1 mostra a tela com a mensagem de erro gerada.

 

...

Quer ler esse conteúdo completo? Tenha acesso completo