[firebase-br] Bug grave no Firebird

Otto ottofuch em terra.com.br
Qua Jul 13 10:32:36 -03 2005


Pois é, não há nenhuma padronização ANSI/ISO, e assim, depende da
implementação. Quem especificou o Firebird o especificou como está. O
Firebird Book da Helen tem várias páginas sobre o assunto. Vou apenas
traduzir um pequeno trecho referente ao tipo de dado NUMERIC:

"O formato do tipo de dado NUMERIC é
NUMERIC(p,s)

Por exemplo, NUMERIC(4,2) formalmente define um número consistindo de até
quatro dígitosd, incluindo dois dígitos à direita do ponto decimal. Assim,
os números 89.12  e 4.321 serão armazenados numa coluna NUMERIC(4,2) como
89.12 e 4.32, respectivamente. No segundo exemplo, o final 1**-3 (NT um
elevado a menos três)  está fora de escala e é desprezado.

Todavia, é possíve armazenar nesta coluna um número de precisão maior do que
a declarada. O máximo seria 327.67 - isto é, um número com uma precisão de
5. Porque a base de dados armazena o número atual (NT: real) como um
SMALLINT, os números não começarão a causar erros de overflow até o número
armazenado internamente ser maior do que 32767 ou menor do que -32768".

Nota-se que no exemplo acima,  o ponto decimal é implícito, como é o caso do
BCD no COBOL. Em 4.321, há duas transformações:
Primeiro 4.32, e depois 432, com o ponto decimal implícito.

 NUMERIC(12,4) significa 99999999.9999 e sem o ponto decimal, 999999999999.
Números com precisão entre 10 e 18 são representados por BIGINT.
BIGINT vai de um mínimo de
-9223372036854775808 a um máximo de
9223372036854775807
(de -2**63 a +2**63-1). Como o Firebird armazena o número como um BIGINT, e
separadamente a quantidade de dígitos após a vírgula, ele vai "berrar"
quando for usado um número entre -2**63 e 2**63-1.
63 bits mais um bit para o sinal é igual a 64 bits. E 64 bits representam 8
bytes. Um BIGINT é armazenado em 8 bytes.

Segundo o Firebird Book, a diferença entre os tipos de dados NUMERIC e
DECIMAL é:

"Por exemplo, NUMERIC(4,2) define um número consistindo de até quatro
dígitos..."
"De forma similar a NUMERIC, DECIMAL(4,2) define um número consistindo de
pelo menos quatro dígitos...

ou seja:"..NUMERIC ... até x dígitos .." enquanto que "..DECIMAL.. de pelos
menos x dígitos...". No primeiro caso, x é um limite máxim, e no segundo
caso, x é um limite mínimo.

Como isto está nas especificações do Firebird, não creio que isto vá ser
modificado, seja num outro dialeto, seja numa futura versão. Seria
conveniente que fosse adicionado um tipo de dado CURRENCY.

100+
Otto
----- Original Message ----- 
From: "Sidnei" <sidnei em amcom.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Wednesday, July 13, 2005 8:04 AM
Subject: Re: [firebase-br] Bug grave no Firebird


Não concordo muito com vc, pois o banco de dados, tem varias
funcionalidades. A principal delas que todo mundo sabe, eh armazenar dados.
As outras, dai vai de cada banco. Mas como vi que no firebird tem uma opcao
para criar um campo do tipo NUMERIC(12,4), entao no meu entender, ele vai
"Berrar" quando inserir algum valor maior do que o especificado no tipo do
campo. Se ele nao "Berrar", para mim, nao se torna uma funcionalidade do
banco, e sim uma preocupacao, pois terei que fazer tratamentos que o banco
de dados deveria fazer e nao faz.

Outra coisa, vc comparou o Firebird com alguns bancos de dados. Eu aki, uso
o Firebird em mais ou menos 30 estacoes que descarregam numa base Online
Oracle. O que acontece:
- O Firebird aceita numeros fora do NUMERIC(12,4), e quando vai descarregar
para o Oracle, ele "Berra" lah dizendo que nao aceita.

Sidnei
----- Original Message ----- 
From: "Otto" <ottofuch em terra.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Tuesday, July 12, 2005 5:54 PM
Subject: Re: [firebase-br] Bug grave no Firebird


> Nos arquivos xBase (.DBF) os valores numéricos são armazenados como
> strings
> de caracteres e convertidos para os valores após a leitura no arquivo de
> dados .DBF.
> No Paradox não sei, pois a Borland nunca abriu dados sobre o Paradox. Mas
> permite, além de currency, o BCD
>
> Em
>
http://www.uniube.br/uniube/cursos/graduacao/tpd/Disciplinas/jr/minicurso/ParadoxSQL.html#topico2
> temos:
> "BCD (Binary Coded Decimal - # ) : Este tipo de campo é usado para
> realizar
> cálculos numéricos com uma precisão maior do que aquela efetuada com os
> demais tipos númericos. A principal utilidade deste tipo de campo consiste
> em fornecer compatibilidade com outras aplicações que usam dados deste
> tipo,
> pois no caso da utilização de tabelas Paradox num aplicativo, só serão
> permitidos números com um máximo de 15 algarismos significativos. "
>
> O BCD é muito usado no COBOL (COmmon Business Orientated Language), e pelo
> que me lembro, num byte, usa ós dois nibles do byte. Um byte, de 8 bits,
> compõe-se de dois nibles  22221111 onde 1111 é o nible à direita, e 2222 é
> o
> nible à esquerda. Com um nible pode-se representar númeos de 0 a 15. Mas
> em
> cada nible, apenas os númeos de 0 a 9 são aproveitados para representar os
> respectivos numeros decimais. Consegue-se armazenar dois dígitos decimais
> nun byte.
>
> Tanto o Delphi 6 quanto o C++ Builder 5 (foi os que eu olhei) tem classes
> de
> suporte à representação BCD. Mas como também existe o tipo currency, não
>> necessidade, embora o currency sempre opera com quatro casas decimais após
> a
> vírgula (ponto para os americanos).
>
> No caso do Firebird (e Access e outros mais) o negócio é entregar os
> números
> já na conformação certa ao Firebird. Quantos aos dados calculados
> internamente ...
> 100+
> Otto
>
>
>
>
>
>
>
> ----- Original Message ----- 
> From: "PHA (TeamFB)" <lista em pha.com.br>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Tuesday, July 12, 2005 10:54 AM
> Subject: Re: [firebase-br] Bug grave no Firebird
>
>
>> Concordo com o Sydnei, o limite deveria ser respeitado.
>>
>> Eles mudaram isso, so nao me lembro em qual versão, antigamente o Numeric
> era respeitado e o Decimal nao.
>>
>> NUMERIC datatype
>>
>> NUMERIC(x,y)
>> In the syntax above, InterBase stores exactly x digits. Of that number,
> exactly y digits are
>> to the right of the decimal point. For example,
>>
>> NUMERIC(5,2)
>> declares that a column of this type always holds numbers with exactly 5
> digits, with
>> exactly two digits to the right of the decimal point: ppp.ss.
>>
>> DECIMAL datatype
>>
>> DECIMAL(x,y)
>> In the syntax above, InterBase stores at least x digits. Of that number,
> exactly y digits are
>> to the right of the decimal point. For example,
>>
>> DECIMAL(5,2)
>> declares that a column of this type must be capable of holding at least
> five but possibly
>> more digits and exactly two digits to the right of the decimal point:
> ppp.ss.
>>
>> PHA
>> Nova Odessa / SP - Brazil
>> Membro do TeamFB (FireBase)
>>
>> -----Mensagem original-----
>> From: "Sidnei" sidnei em amcom.com.br
>> Date: Tue, 12 Jul 2005 12:12:44 -0300
>> To: "Carlos H. Cantu" listas em warmboot.com.br
>> Subject: Re: [firebase-br] Bug grave no Firebird
>>
>> > Resumindo, o NUMERIC(12,4) nao serve pra nada de controle do
> Firebird....
>> >
>> >
>> > ----- Original Message ----- 
>> > From: "Carlos H. Cantu (TeamFB)" <listas em warmboot.com.br>
>> > To: "FireBase" <lista em firebase.com.br>
>> > Sent: Tuesday, July 12, 2005 11:09 AM
>> > Subject: Re: [firebase-br] Bug grave no Firebird
>> >
>> >
>> > > No dialeto 3, um campo numeric (12,4) é armazenado internamente como
>> > > um inteiro de 64bits, que permite valores entre:
>> > >
>> > > -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807
>> > >
>> > > No seu caso, como vc determinou 4 casas decimais, irá conseguir
>> > > armazenar valores etre:
>> > >
>> > > -922.337.203.685.477,5808 e 922.337.203.685.477,5807
>> > >
>> > > []s
>> > > Cantu (Membro do TeamFB - FireBase)
>> > > http://www.warmboot.com.br
>> > > FireBase - http://www.FireBase.com.br
>> > >
>> > > S> Estou usando o Firebird versão 1.5.2.4731, e aconteceu um
>> > > S> problema onde me assustei muito. Vou passar o problema abaixo
>> > > S> atravez de script:
>> > >
>> > > S> CREATE TABLE TESTE(VAL1 NUMERIC(12,4));
>> > > S> COMMIT;
>> > >
>> > > S> INSERT INTO TESTE
>> > > S> (VAL1)
>> > > S> VALUES
>> > > S> (1234567890123);
>> > > S> COMMIT;
>> > >
>> > > S> Notem que criei um campo com capacidade de 12 e o firebird
>> > > S> aceita eu inserir um valor com 13 digitos.
>> > >
>> > > S> Alguem pode me dizer se ja passou por isso?
>> > >
>> > > S> Sidnei
>> > > S> ______________________________________________
>> > > S> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>> > > S> Para editar sua configuração na lista, use o endereço
>> > > S> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>> > > S> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>> > >
>> > >
>> > > ______________________________________________
>> > > FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>> > > Para editar sua configuração na lista, use o endereço
>> > > http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>> > > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>> >
>> >
>> > ______________________________________________
>> > FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>> > Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista