Se deparando com a mensagem “Invalid field size”

Você, programador/programadora Delphi, já se deparou com essa mensagem de erro?

Pois bem… li várias postagens em blogs de discussão Delphi e muitos desenvolvedores já enfrentaram este tipo de problema, porém, embora alguns desenvolvedores conseguiram uma solução, em nenhuma delas foi apresentada uma explicação sobre a causa deste erro.

O que é relatado sobre este erro é que ele ocorre em comandos “muito simples”, geralmente apenas um SELECT trazendo alguns campos de uma única tabela, sem utilização de JOIN.

Este erro ocorre com o componente TSQLDataSet, onde a sua propriedade “CommandText” possui o código SQL a ser usado para trazer informações de uma tabela. Ao se executar a ação OPEN deste componente, o erro é retornado! Só isso. Sem motivo aparente. Sem explicação.

Vamos então a dois exemplos de códigos onde um não acarreta este erro e outro sim.

Ex.

Consideremos a tabela:

create table produto (
  id int(10),
  descricao varchar(200),
  obs text
) default charset=utf8;


A sequência de comandos a seguir será executada sem erros.

TSQLDataSet.CommandText := ' select id, descricao, obs from produto ';
TSQLDataSet.Open;

Já neste caso a seguir teremos o erro “Invalid field size”.

TSQLDataSet.CommandText := ' select id, descricao, trim(obs) from produto ';
TSQLDataSet.Open;


Perceberam a diferença entre os 2 códigos?

Basta você ter uma tabela codificada com CHARSET=UFT8 e fazer um SELECT trazendo um campo TEXT com alguma “manipulação” de string, que no caso foi a função TRIM() do SQL.

Todo o tratamento da string deve ser previamente gravado na tabela e ao recuperar este campo você deve trazer ele “puro”, como por exemplo “SELECT campo FROM tabela”.

Outras funções de formatação de strings também causam este erro, como por exemplo as funções, TRIM(), UPPER(), LOWER(), e todas funções que formatam o conteúdo do campo.

Não testei outros casos nem outras funções, e não consegui informação suficiente para entender porque essas funções causam este erro, mas a luz para este problema foi encontrada.

Caso você tenha enfrentado este erro e tenha mais informações, deixe seus comentários aqui no post.

Bom desenvolvimento a todos!