[Resolvido]Salvando dados telefone formatado no mysql

Tenho uma dúvida com respeito a formatação de um campo telefônico/celular:
Veja parte do trecho do meu código html javascript:

[code]Telefone (Fixo)


		    <script>
				jQuery(function($){
  				 	$("#tel").mask("(99) 9999-9999");
   					
				});

			</script> [/code]

Minha servelet:

Minha classe DTO Contato:

public class Contato { private String telefone; public String getTelefone() { return telefone; } public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; }
Meu tabela possui a coluna pf_telefone do tipo varchar(10)(MYSQL)
Como posso salvar o campo telefônico com o seguinte formato 99 9999-9999 ?

varchar(10) mysql só suportará 10 caracteres. Logo (XX) XXXX-XXXX que contém 12 caracteres jamais será salvo assim.
A idéia da máscara é justamente mascarar um valor recebido sem formato.
Ou seja, não deve ser persistido assim.

Certo, mas digamos que eu altere o valor varchar para 12 acredito que ainda terei problemas certo?

Para persistir não. Talvez ao apresentar valores salvos com a máscara.
O tipo varchar permite quaisquer caracters ASCII em qualquer combinação, até o limite de 255 caracteres. Para o MySQL, mais do que 255 caracteres caracteriza um tipo text, que tem a mesma prerrogativa, sem esta limitação.

Boa, vou tentar ver aqui qualquer coisa eu posto novamente, mas acredito que com essas dicas da para resolver muita coisa , caso não consiga posto uma resposta.

Particularmente eu acho q vc deveia salvar o campo sem máscara e formatar apenas na tela, eu já tive alguns problemas com campos persistidos com máscaras (em sistemas legados). Em meus sistemas persisto todos os campos sem máscara (inclusive CNPJ, CPF, CEP, entre outros).

A forma ideal é salvar sem máscaras.

Bom realmente acho que o correto é salvar sem mascara mesmo, o problema que estou tendo é que eu tenho um javascript no meu form apenas para segurar que o usuário digite no padrão (99)9999-9999 e estou tendo dificuldade ao persistir sem mascara mesmo no apenas 9999999999 ok?

Posta o erro q está ocorrendo e o código onde vc faz a persistência dos dados.

Veja o erro que está dando lembrando que pf_telefone é varchar(12):

[code]HTTP Status 500 - com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column ‘pf_telefone’ at row 1

type Exception report

message com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column ‘pf_telefone’ at row 1

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.lang.RuntimeException: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column ‘pf_telefone’ at row 1
br.com.cad.dao.Cadastro.adiciona(Cadastro.java:40)
br.com.cad.servlet.AddDados.service(AddDados.java:68)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
root cause

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column ‘pf_telefone’ at row 1
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4185)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815)
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)
br.com.cad.dao.Cadastro.adiciona(Cadastro.java:36)
br.com.cad.servlet.AddDados.service(AddDados.java:68)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)[/code]

O ideal é sempre salvar sem máscara e como string (preservando os zeros à esquerda). Ou seja, um CNPJ como o do Banco do Brasil (00.000.000/0001-91) deve ser salvo como 00000000000191.

Se você tiver problemas de espaço e souber que um determinado campo tem sempre 14 dígitos (no caso do CNPJ) pode guardar como numérico mesmo, mas sempre dá aquela dor de cabeça do programador que não sabe botar zeros à esquerda :slight_smile:

Vc está tentando persistir um dado q excede o tamanho da coluna, no caso a coluna “pf_telefone” confira o valor q vc está tentando persistir, com certeza é maior q 12 ou a coluna é menor q isso.

Uma dúvida no meu formulário eu tenho a mascara exatamente para que o usuário digite nesse padrão: (99)9999-9999. Há alguma maneira de que quando eu persistir no banco ficar somente o numero do telefone sem alguma mascara com o EX: 99 99999999 ? Como posso fazer pois do jeito atual ele fica assim persistido: (99)9999-9999!!!

Vc pode remover a máscara no java, antes de persistir, no meu caso eu crio uma classe Util e dentro dessa classe tenho alguns métodos q utilizo em vários locais, um deles é para remover a máscara de qualquer campo q eu queira persistir no banco, segue abaixo um exemplo:

public static String unmaskNumero(String texto) {
    StringBuilder sb = new StringBuilder();
    sb.append(texto);
	
    // Percorre a String e verifica se o caracter é um dígito e em caso negativo remove	
    for (int i = 0; i &lt; sb.length(); i++) {
        if (!Character.isDigit(sb.charAt(i))) {
	    sb.deleteCharAt(i);
	    i--; // subtrai 1 de &quot;i&quot; para verificar índice anterior já que um dígito foi removido do texto
	}
    }
		
    return sb.toString();
}