?Eu neste caso, acho melhor char(11) só cpf e char(14) cnpj ou cnpj junto 
com cpf.
Minhas justificativas:
char porque: este campo não vai ser usado para calculos (tipo salarios, 
vendas,etc) e o uso de qualuqer tipo de campo valor ao meu ver é mais 
dispendioso para o banco de dados.
char em vez de varchar  porque: melhora no desempenho, indexar com char gera 
uma resposta mais rápida que em varchar (verifiquei pessoalmente e também 
via literatura sobre isto).

Só não concordo com vc sobre o uso de varchar, pelo motivo citado acima.

Eduardo Az
Dep.TI
EMBRASIS
+55(11)2122-0241 PABX
+55(11)8125-3845 TIM
+55(11)9826-0138 VIVO
eduard...@embrasis.com.br
-----Mensagem Original----- 
From: Marcelo Silva
Sent: Monday, November 08, 2010 6:35 PM
To: Comunidade PostgreSQL Brasileira
Subject: Re: [pgbr-geral] campo cpf

Olha fiquei meio tonto aqui rsrs
Não sou DBA sou programador Delphi, PHP, mas eu quem crio minhas bases, pois
trabalho sozinho em casa, e gostaria de entender melhor isso.
Por que todo esse trabalho?
O ganho em guardar Bigint é tão grande assim, com relação ao char ou
varchar?
Ou existe alguma "regra aurea" para estes casos?
Eu por exemplo coloco em um campo Varchar(14) e guardo somente numeros tanto
cpf como cnpj e na mesma tabela tem um campo Char(1) que informa se é P ou
F, então formato na hora de exibir, outra coisa que faço é validar os dados
antes de incluir na base, se é CPF ou CNPJ valido conforme a escolha do
usuário.
Por que uso Varchar e não Char?
Porque presumo que terei 11 ou 14 caracteres no campo e o banco se encarrega
de alocar conforme o tamanho da string.
Bem, não tenho notato nada de anormal nas minhas aplicações, mas, sabem como
é... se tiver dicas pra melhorar, estamos nessa.


Marcelo Silva
------------------------------------------------
msn: marc...@ig.com.br
Tel.: (11) 2962-7390
Cel.: (11) 9693-4251

Linux Kubuntu User number is # 24362




----- Original Message ----- 
From: "Emerson Hermann" <emersonherm...@gmail.com>
To: "Comunidade PostgreSQL Brasileira" <pgbr-geral@listas.postgresql.org.br>
Sent: Monday, November 08, 2010 6:14 PM
Subject: Re: [pgbr-geral] campo cpf


/*
Eu uso bigint  sugerido por Oswaldo e na hora da apresentação uso
essas duas functions:
Detalhe não valida os cpf apenas mascara
*/

DROP FUNCTION IF EXISTS sp_formataCPF(cpf_bigint BIGINT);
CREATE OR REPLACE FUNCTION sp_formataCPF (cpf_bigint BIGINT) RETURNS TEXT AS
$$
--OBS: Essa function nao faz a validacao do CPF, apenas formata para o
modo texto.
DECLARE
cpf_text  TEXT;
BEGIN

     IF LENGTH(CAST (cpf_bigint AS TEXT))  <= 11 THEN
        cpf_text := REPEAT('0', 11-LENGTH(CAST (cpf_bigint AS TEXT)))
|| CAST (cpf_bigint AS TEXT); -- efetua a conversao
     ELSE
        cpf_text := 'CPF >11 DIG'; -- caso o cpf ultrapasse os 11 digitos
     END IF;

     RETURN cpf_text; -- Retorna CPF em formato texto

END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION sp_formataCPF(cpf_bigint BIGINT) IS '
Autor: O Peregrino (emersonherm...@gmail.com)
Function que converte CPF em BIGINT para TEXT.
--OBS: Nao efetua validacao do CPF, excetuando-se caso o CPF
ultrapasse 11 digitos.
--Exemplo de uso:
--SELECT sp_formataCPF(848327462); -- resultado "00848327462"

'
;


-- adotando polimorfismo da função sp_formataCPF

DROP FUNCTION IF EXISTS sp_formataCPF(cpf_bigint BIGINT, mask BOOLEAN);
CREATE OR REPLACE FUNCTION sp_formataCPF (cpf_bigint BIGINT, mask
BOOLEAN) RETURNS TEXT AS $$
--OBS: Essa function nao faz a validacao do CPF, apenas formata para o
modo texto e adiciona o mascaramento.
DECLARE
cpf_text  TEXT;
BEGIN

     IF LENGTH(CAST (cpf_bigint AS TEXT))  <= 11 THEN
        cpf_text := REPEAT('0', 11-LENGTH(CAST (cpf_bigint AS TEXT)))
|| CAST (cpf_bigint AS TEXT); -- efetua a conversao
        IF mask THEN
          cpf_text := SUBSTRING(cpf_text FROM 1 FOR 3)
                      || '.'
                      || SUBSTRING(cpf_text FROM 4 FOR 3)
                      || '.'
                      || SUBSTRING(cpf_text FROM 7 FOR 3)
                      || '-'
                      || SUBSTRING(cpf_text FROM 10 FOR 2); -- faz o
mascaramento do cpf
        END IF;
     ELSE
        cpf_text := 'CPF >11 DIG'; -- caso o cpf ultrapasse os 11 digitos
     END IF;

     RETURN cpf_text; -- Retorna CPF em formato texto

END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION sp_formataCPF(cpf_bigint BIGINT, mask BOOLEAN) IS '
Autor: O Peregrino (emersonherm...@gmail.com)
Function que converte CPF em BIGINT para TEXT com opcao para adicionar
mascara.
--OBS: Nao efetua validacao do CPF, excetuando-se caso o CPF
ultrapasse 11 digitos.
--Exemplo de uso:
--SELECT sp_formataCPF(848327462,TRUE); -- resultado "008.483.274-62"
'
;



Em 8 de novembro de 2010 16:50, Osvaldo Kussama
<osvaldo.kuss...@gmail.com> escreveu:
> Em 8 de novembro de 2010 17:39, Marcone <marconepe...@gmail.com> escreveu:
>> No meu caso eu já uso o char, pq com campos numéricos não serão
>> guardados os zeros à esquerda. Se você for usar o mesmo campo para
>> armazenar CPF e CNPJ os zeros à esquerda podem transformar um CNPJ em
>> um CPF (verificações à parte). Eu já tive trabalho com isso e não
>> recomendo campos numéricos para CPF/CNPJ.
>>
>
>
> Creio que você está fazendo uma confusão entre o formato de
> armazenamento e o formato de exibição.
> O número 1 = 01 = 001 etc, a cadeia de caracteres "1" realmente é
> diferente de "01" ou "001" mas tanto o CPF quanto o CNPJ são códigos
> numéricos, ou seja, zeros a esquerda não alteram seu significado.
>
> Osvaldo
> _______________________________________________
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral 
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a