none
[RESOLVIDO] Tamanho dos campos na criação de tabelas RRS feed

  • Pergunta

  • Fala galera, tenho uma duvida que já me persegue a um certo tempo, hoje resolvi postar aqui pq sei que alguém aqui vai me ajudar rs.

    É o seguite...

    Estou montando uma aplicação em C# conectando ao banco SQL Server

    Na criação das tabelas, crio por exemplo a tabela "Clientes", nessa tabela tem o campo "Nome". O Campo "Nome" é uma string, então eu defino o tipo de dado como VARCHAR(50).

    O problema é o seguinte, eu não tenho como saber a quantidade de caracteres que os nomes vão ter, podem ter nomes com 20 caracteres e outros com 23 caracteres. Como eu defino 50 no tamanho do campo, se eu insiro um nome que tem somente 20 caracteres, quando faço uma query pra minha aplicação (uma textbox), ele puxa o nome certinho, mas com 30 espaços em branco depois do nome.

    Se eu faço a query no SQL Server Management Studio, quando copio o resultado e colo num bloco de notas por exemplo, acontece a mesma coisa.

    Alguém sabe um tipo de dado em que o tamanho seja automático? 

    Obrigado!


    quinta-feira, 21 de janeiro de 2016 00:06

Respostas

  • Então pessoal, obrigado pelas respostas

    Defini o campo como tipo VARCHAR(50), fiz um update em um registro que já existia e ficou normal sem os espaços em branco.

    Estava usando ADO.NET para acessar o banco, acho que com esse modo estava gravando o nome digitado mais os espaços em branco. Migrei meu projeto pra Entity Framework e está funcionando perfeito.

    Obrigado a todos!

    quinta-feira, 4 de fevereiro de 2016 00:34
  • Gustavo,

    Por padrão o tipo de dados VARCHAR não tem esse comportamento.

    Verifica por gentileza se na hora da gravação dos dados a aplicação não está inserindo com espaços no banco de dados.

    De qualquer maneira segue abaixo link para leitura explicando um pouco sobre os tipos de dados CHAR, VARCHAR e sobre o parâmetro ANSI_PADDING, que altera um pouco o comportamento relacionado aos espaços em branco a direita da string.

    https://technet.microsoft.com/pt-br/library/ms175055%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396

    Espero ter ajudado..


    Felipe Lauffer MCSA: SQL Server | MCP


    quinta-feira, 21 de janeiro de 2016 01:01

Todas as Respostas

  • Gustavo,

    Por padrão o tipo de dados VARCHAR não tem esse comportamento.

    Verifica por gentileza se na hora da gravação dos dados a aplicação não está inserindo com espaços no banco de dados.

    De qualquer maneira segue abaixo link para leitura explicando um pouco sobre os tipos de dados CHAR, VARCHAR e sobre o parâmetro ANSI_PADDING, que altera um pouco o comportamento relacionado aos espaços em branco a direita da string.

    https://technet.microsoft.com/pt-br/library/ms175055%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396

    Espero ter ajudado..


    Felipe Lauffer MCSA: SQL Server | MCP


    quinta-feira, 21 de janeiro de 2016 01:01
  • Olá Gustavo,

    Faça o seguinte teste pelo SSMS.

    use tempdb 
    go
    
    create table teste12 (nome varchar(50))
    
    insert into teste12 (nome) values ('Gabriel'+space(43))
    insert into teste12 (nome) values ('Gabriel')
    
    select nome+'|' from teste12
    
    

    Veja que no primeiro insert foi incluído o nome Gabriel com espaço em branco no começo. 

    No segundo caso foi incluído somente o nome Gabriel.

    Em ambos os caso, os dados estão gravados em um coluna VARCHAR(50). No primeiro insert foi armazenado 50 bytes (o nome e os espaços em branco).

    No segundo caso foi armazenado 7 bytes.

    O que está acontecendo é no momento de gravar os dados, no C# está incluindo de alguma forma os caracteres em branco no final.

    Acho que é isso.

    Wolney.


    Wolney

    quinta-feira, 21 de janeiro de 2016 01:09
  • Gustavo,

    O exemplo do Wolney é perfeito para sua necessidadde, mas vale ressaltar que mesmo não tendo utilizado todo espaço disponível no campo varchar, como no exemplo da palavra Gabriel que teoricamente serão armazenado e ocupados lógicamente 7 bytes, mas internamente serão 8 bytes pois o SQL Server vai acrescentar mais 1 byte como digito de controle e identificar de espaço ocupado para esta coluna.

    Esse pode ser reconhecido como um comportamento normal para colunas varchar quando sua capacidade total de armazenamento não é ocupada totalmente.

    Utilize a função Datalength para obter o tamanho em bytes de cada dado armazenado em suas colunas varchar().


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 21 de janeiro de 2016 11:35
    Moderador
  • Então pessoal, obrigado pelas respostas

    Defini o campo como tipo VARCHAR(50), fiz um update em um registro que já existia e ficou normal sem os espaços em branco.

    Estava usando ADO.NET para acessar o banco, acho que com esse modo estava gravando o nome digitado mais os espaços em branco. Migrei meu projeto pra Entity Framework e está funcionando perfeito.

    Obrigado a todos!

    quinta-feira, 4 de fevereiro de 2016 00:34
  • Gustavo! Se foi resolvido marca como resposta!
    quinta-feira, 4 de fevereiro de 2016 04:33