AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 338742
Accepted
questionto42
questionto42
Asked: 2024-04-18 00:36:47 +0800 CST2024-04-18 00:36:47 +0800 CST 2024-04-18 00:36:47 +0800 CST

Por que você deve sempre escrever “varchar” com o comprimento entre colchetes atrás dele? Freqüentemente, você obtém o resultado certo sem fazer isso

  • 772

"Muitas vezes, você obtém o resultado certo sem fazer isso."

Exemplo:

select CONVERT(varchar, getdate(), 112)

saídas

20240417

Eu vi isso em alguns lugares no Stack Exchange até encontrar um pequeno comentário que dizia ao leitor para não esquecer o comprimento entre colchetes. Afirmei que isso não é necessário se você definir o número do estilo para uma data e hora como esta. No entanto, agora tenho conhecimento suficiente para entender que "varchar nunca deve ficar sozinho", deve sempre ser escrito como algo como varchar(1234).

Quanto ao código acima, seria:

select CONVERT(varchar(8), getdate(), 112)

Se você olhar para ele, a saída é a mesma:

20240417

Um comentário abaixo foi ainda mais longe: char(8)deveria ser levado em consideração, já que

nenhum valor no estilo 112 será menor que 8 caracteres.

Por que você deve sempre escrever varchar com o comprimento entre colchetes atrás dele?

Links que levaram a esta pergunta

  • Converter data aaaa-mm-dd em número inteiro AAAAMM - DBA SE
  • SQL Server Converter Varchar em Datetime - Stack Overflow
  • Converter data em tipo de dados numérico - Stack Overflow
sql-server
  • 2 2 respostas
  • 147 Views

2 respostas

  • Voted
  1. Best Answer
    Sean Gallardy
    2024-04-18T01:00:28+08:002024-04-18T01:00:28+08:00

    Por que você ainda deve sempre escrever varchar com o comprimento entre colchetes atrás dele? Freqüentemente, você obtém o resultado certo sem fazer isso.

    Freqüentemente e sempre são duas coisas distintas.

    Exemplo:

    DECLARE @bin VARBINARY(200) = CAST('I have a lovely bunch of coconuts' AS varbinary(200))
    
    select convert(varchar, @bin)
    

    A saída está faltandouts

    Eu tenho um lindo monte de casulos

    Isso se deve ao comportamento padrão :

    Quando n não é especificado em uma definição de dados ou em uma instrução de declaração de variável, o comprimento padrão é 1. Se n não for especificado ao usar as funções CASTe CONVERT, o comprimento padrão é 30.

    O que significa que qualquer coisa sem o número de bytes na definição é, na melhor das hipóteses, um bug eventual e resulta em perda de dados que, na pior das hipóteses, ninguém saberá.


    Além disso, observe que n in varchar(n)denota o número de bytes , não de caracteres:

    Um equívoco comum é pensar que com char(n) e varchar(n) , o n define o número de caracteres. No entanto, em char(n) e varchar(n) , o n define o comprimento da string em bytes (0 a 8.000). n nunca define o número de caracteres que podem ser armazenados. Isso é semelhante à definição de nchar(n) e nvarchar(n) .

    O equívoco acontece porque ao usar a codificação de byte único, o tamanho de armazenamento de char e varchar é n bytes e o número de caracteres também é n . No entanto, para codificação multibyte, como UTF-8 , intervalos Unicode mais altos (128 a 1.114.111) resultam em um caractere usando dois ou mais bytes.

    Por exemplo, em um contexto de agrupamento UTF8, o seguinte retorna 16:

    SELECT DATALENGTH('😎😎😎😎');
    

    Para armazenar essa string, você precisaria de pelo menos varchar(16), não varchar(4).

    • 8
  2. questionto42
    2024-04-20T23:37:25+08:002024-04-20T23:37:25+08:00

    Não definir o comprimento de um varchar é comum, veja, por exemplo, Qual é o significado de 1/1/1753 no SQL Server? onde aparece a resposta mais votada SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)e ninguém reclamou depois de 13 anos e 171 mil visualizações. No entanto, ser difundido nem sempre significa ser bom.

    Por que você deveria colocar o comprimento atrás de cada varchar ?

    DECLARE @x varchar = CONVERT(varchar, getdate(), 112);
    select @x
    select CONVERT(varchar(8), getdate(), 112)
    

    Fora:

    20240417
    

    Achei que 8não seria necessário, pois o comprimento da saída poderia ser definido pelo style 112. No entanto, uma observação em Converter data aaaa-mm-dd em número inteiro AAAAMM por @AaronBertrand mostra:

    Se o estilo pudesse corrigir o comprimento, isso funcionaria conforme o esperado:
    DECLARE @x varchar = CONVERT(varchar, getdate(), 112);
    mas isso apenas retorna o caractere único 2 [em vez de 20240417] (e FORMAT também não pode salvá-lo ). O problema é que o SQL Server decidiu para você que isso é varchar(1)muito antes de você atribuir qualquer coisa, e algum número de estilo não mudará de ideia.

    E outra observação ainda pede que você faça, charem vez de varcharse você tiver certeza de que deve ter esse comprimento o tempo todo:

    Você sabe que quer 6 caracteres? Então digite char(6)em vez de varchar/* digitar é difícil */. Não há razão para NÃO ser explícito (ou usar varchar para comprimento fixo) e todos os motivos para ter cuidado.

    Seu blog Bad Habits to Kick: Varchar sem comprimento mostra em profundidade por que você deve escrever o comprimento entre colchetes atrás de any varchar:

    Como o atributo length é opcional, as pessoas parecem presumir que definir um varchar no T-SQL é como definir uma string em C#: "ele apenas se expandirá para qualquer tamanho que você inserir nele". O problema é que, se você não definir um comprimento, o SQL Server atribuirá um para você, e pode não ser o comprimento esperado. Em alguns cenários, será 1; em outros, 30.

    • -1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve