Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que o Delphi (Zeos) está me dando campos widestring no SQLite quando peço unsigned big int?


Não, ele não "reverte" para string, o SQlite apenas armazena os dados conforme são fornecidos.

Como a documentação afirma :

Se você fornecer/vincular um valor de texto, ele armazenará um valor de texto. Não há conversão para o tipo fornecido na instrução CREATE TABLE, pois pode aparecem em outros RBMS mais estritos, e. MySQL.

Então, no seu caso, se você recuperar os dados como ftWideString , acho que é porque você escreveu os dados como TEXT. Por exemplo, a ferramenta ou programa que cria o conteúdo SQLite3 do seu MySQL está escrevendo esta coluna como TEXT.

Sobre números, não há "assinado"/"não assinado", nem verificação de precisão no SQLite3. Portanto, se você deseja armazenar valores "unsigned big int", basta usar INTEGER, que são Int64.

Mas, em todos os casos, mesmo que a API SQLite3 ofereça suporte a inteiros de 64 bits UNSIGNED , este sqlite3_uint64 tipo dificilmente pode ser suportado pela API Zeos/ZDBC ou pelo Delphi (versões mais antigas do Delphi NÃO suportam UInt64). Para ter certeza, você deve recuperar melhor esses valores como TEXT e convertê-los como UInt64 manualmente em seu código Delphi.

Atualização:

Você está usando o TDataSet descendente fornecido por Zeos? Este componente está vinculado ao DB.Pas , portanto, espera um único tipo por coluna. Pode ser a fonte de confusão do seu código (que você não mostrou, então é difícil descobrir o que está acontecendo).

Você deve usar melhor a interface ZDBC de nível inferior, que permite recuperar o tipo de coluna para cada linha e chamar o método getter de valor conforme necessário.