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
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"?
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.
...