?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