Qual é a diferença entre varchar e nvarchar?

É só que nvarchar suporta caracteres multibyte? Se for esse o caso, existe realmente algum ponto, além de preocupações com armazenamento, para usar varchars ?

Uma coluna nvarchar pode armazenar quaisquer dados Unicode. Uma coluna varchar é restrita a uma página de códigos de 8 bits. Algumas pessoas pensam que o varchar deve ser usado porque ocupa menos espaço. Eu acredito que esta não é a resposta correta. Incompatibilidades de página de código são uma dor e Unicode é a cura para problemas de página de código. Com disco e memory baratos hoje em dia, não há realmente nenhuma razão para perder tempo mexendo nas páginas de códigos.

Todos os sistemas operacionais e plataformas de desenvolvimento modernos usam o Unicode internamente. Usando nvarchar vez de varchar , você pode evitar fazer conversões de codificação toda vez que ler ou gravar no database. As conversões levam tempo e são propensas a erros. E a recuperação de erros de conversão é um problema não trivial.

Se você estiver interagindo com um aplicativo que usa apenas ASCII, eu ainda recomendaria usar o Unicode no database. Os algoritmos de agrupamento de sistema operacional e database funcionarão melhor com o Unicode. O Unicode evita problemas de conversão ao fazer interface com outros sistemas. E você estará se preparando para o futuro. E você sempre pode validar que seus dados estão restritos ao ASCII de 7 bits para qualquer sistema legado que você esteja mantendo, mesmo enquanto desfruta de alguns dos benefícios do armazenamento Unicode completo.

varchar : Dados de caracteres não-Unicode de comprimento variável. O agrupamento do database determina qual página de código os dados são armazenados usando.

nvarchar : Dados de caracteres Unicode de tamanho variável. Dependente do agrupamento de database para comparações.

De posse desse conhecimento, use o que corresponder aos dados de input (ASCII v. Unicode).

Eu sempre uso o nvarchar, pois ele permite que qualquer coisa que eu esteja construindo possa suportar praticamente qualquer dado que eu lançar nele. Meu sistema CMS faz chinês por acidente, porque eu usei nvarchar. Atualmente, qualquer novo aplicativo não deve se preocupar com a quantidade de espaço necessária.

Aqui você pode ver as diferenças entre varchar e nvarchar .

Digite a descrição da imagem aqui

Digite a descrição da imagem aqui

Digite a descrição da imagem aqui

Digite a descrição da imagem aqui

Referência: SqlHints.com

Para mais informações sobre Nvarchar e varchar, veja esta postagem no blog .

Depende de como o Oracle foi instalado. Durante o processo de instalação, a opção NLS_CHARACTERSET é configurada. Você pode encontrá-lo com o SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET' da consulta SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET' .

Se o seu NLS_CHARACTERSET é uma codificação Unicode como UTF8, ótimo. Usando VARCHAR e NVARCHAR são praticamente idênticos. Pare de ler agora, apenas vá em frente. Caso contrário, ou se você não tiver controle sobre o conjunto de caracteres do Oracle, continue lendo.

VARCHAR – Os dados são armazenados na codificação NLS_CHARACTERSET. Se houver outras instâncias de database no mesmo servidor, você poderá ser restringido por elas; e vice-versa, desde que você tenha que compartilhar a configuração. Esse campo pode armazenar qualquer dado que possa ser codificado usando esse conjunto de caracteres e nada mais . Por exemplo, se o conjunto de caracteres for MS-1252, você só poderá armazenar caracteres como letras inglesas, um punhado de letras acentuadas e algumas outras (como € e -). Seu aplicativo seria útil apenas para alguns locais, incapaz de operar em qualquer outro lugar do mundo. Por esse motivo, é considerado uma idéia ruim.

NVARCHAR – Os dados são armazenados em uma codificação Unicode. Todo idioma é suportado. Uma boa ideia.

E quanto ao espaço de armazenamento? O VARCHAR é geralmente eficiente, uma vez que o conjunto / codificação de caracteres foi projetado especificamente para uma localidade específica. Os campos NVARCHAR armazenam em codificação UTF-8 ou UTF-16, baseiam-se ironicamente na definição NLS. O UTF-8 é muito eficiente para idiomas “ocidentais”, enquanto ainda suporta idiomas asiáticos. O UTF-16 é muito eficiente para idiomas asiáticos, enquanto ainda suporta idiomas “ocidentais”. Se estiver preocupado com o espaço de armazenamento, escolha uma configuração de NLS para fazer com que o Oracle use UTF-8 ou UTF-16 conforme apropriado.

E quanto à velocidade de processamento? A maioria das novas plataformas de codificação usa Unicode nativamente (Java, .NET, mesmo C ++ std :: wstring de anos atrás!), Portanto, se o campo do database for VARCHAR, forçará o Oracle a converter entre conjuntos de caracteres em cada leitura ou gravação, não tão bem. Usando NVARCHAR evita a conversão.

Bottom line: Use NVARCHAR! Isso evita limitações e dependencies, é bom para o espaço de armazenamento e geralmente é melhor para o desempenho também.

O nvarchar armazena dados como Unicode, portanto, se você for armazenar dados multilíngües (mais de um idioma) em uma coluna de dados, precisará da variante N.

Meus dois centavos

  1. Os índices podem falhar quando não estão usando os tipos de dados corretos:
    No SQL Server: Quando você tem um índice em uma coluna VARCHAR e apresenta uma seqüência Unicode, o SQL Server não faz uso do índice. A mesma coisa acontece quando você apresenta um BigInt para uma coluna indexada contendo SmallInt. Mesmo que o BigInt seja pequeno o suficiente para ser um SmallInt, o SQL Server não é capaz de usar o índice. O outro caminho em torno de você não tem esse problema (ao fornecer SmallInt ou Ansi-Code para uma coluna indexada BigInt ot NVARCHAR).

  2. Os tipos de dados podem variar entre diferentes DBMSs (DataBase Management System):
    Saiba que cada database tem tipos de dados um pouco diferentes e VARCHAR não significa o mesmo em todos os lugares. Enquanto o SQL Server possui VARCHAR e NVARCHAR, um database Apache / Derby possui apenas VARCHAR e o VARCHAR está em Unicode.

Principalmente nvarchar armazena caracteres Unicode e varchar armazena caracteres não-Unicode.

“Unicodes” significa um esquema de codificação de caracteres de 16 bits que permite que caracteres de muitos outros idiomas, como árabe, hebraico, chinês, japonês, sejam codificados em um único conjunto de caracteres.

Isso significa que unicodes está usando 2 bytes por caractere para armazenar e nonunicodes usa apenas um byte por caractere para armazenar. O que significa que os unicodes precisam de capacidade dupla para armazenar em comparação com os não-unicodes.

Você está certo. nvarchar armazena dados Unicode enquanto varchar armazena dados de caractere de byte único. Diferente de diferenças de armazenamento ( nvarchar requer duas vezes o espaço de armazenamento como varchar ), o que você já mencionou, a principal razão para preferir nvarchar sobre varchar seria internacionalização (isto é, armazenar strings em outras linguagens).

Eu diria que isso depende.

Se você desenvolver um aplicativo de área de trabalho, onde o sistema operacional funcione em Unicode (como todos os sistemas Windows atuais) e o idioma oferecer suporte nativo a Unicode (as cadeias padrão são Unicode, como em Java ou C #), vá em nvarchar.

Se você desenvolver uma aplicação web, onde strings vêm como UTF-8, e a linguagem é PHP, que ainda não suporta Unicode nativamente (nas versões 5.x), então o varchar provavelmente será uma escolha melhor.

Se um único byte é usado para armazenar um caractere, existem 256 combinações possíveis e, portanto, você pode salvar 256 caracteres diferentes. Agrupamento é o padrão que define os caracteres e as regras pelas quais eles são comparados e classificados.

1252, que é o Latin1 (ANSI), é o mais comum. Conjuntos de caracteres de byte único também são inadequados para armazenar todos os caracteres usados ​​por vários idiomas. Por exemplo, alguns idiomas asiáticos têm milhares de caracteres, portanto, eles devem usar dois bytes por caractere.

Padrão Unicode

Quando os sistemas que usam várias páginas de código são usados ​​em uma rede, fica difícil gerenciar a comunicação. Para padronizar as coisas, o consórcio ISO e Unicode introduziu o Unicode . Unicode usa dois bytes para armazenar cada caractere. Isso é 65.536 caracteres diferentes podem ser definidos, então quase todos os personagens podem ser cobertos com Unicode. Se dois computadores usam Unicode, todos os símbolos serão representados da mesma maneira e nenhuma conversão é necessária – essa é a idéia por trás do Unicode.

O SQL Server tem duas categorias de tipos de dados de caracteres:

  • não-Unicode (char, varchar e texto)
  • Unicode (nchar, nvarchar e ntext)

Se precisarmos salvar dados de caractere de vários países, use sempre Unicode.

nVarchar irá ajudá-lo a armazenar caracteres Unicode. É o caminho a percorrer se você quiser armazenar dados localizados.

Siga a diferença entre o tipo de dados VARCHAR e NVARCHAR do Sql Server . Aqui você pode ver de uma maneira muito descritiva.

No generalnvarchar armazena dados como Unicode, portanto, se você for armazenar dados multilíngües (mais de um idioma) em uma coluna de dados, precisará da variante N.

Eu dei uma olhada nas respostas e muitos parecem recomendar o uso do nvarchar sobre o varchar , porque o espaço não é mais um problema, então não há problema em habilitar o Unicode para pouco armazenamento extra. Bem, isso nem sempre é verdade quando você deseja aplicar um índice sobre sua coluna. O SQL Server tem um limite de 900 bytes no tamanho do campo que você pode indexar. Então, se você tem um varchar(900) você ainda pode indexá-lo, mas não varchar(901) . Com nvarchar , o número de caracteres é reduzido pela metade, portanto, você pode indexar até nvarchar(450) . Então, se você está confiante de que não precisa de nvarchar , não recomendo usá-lo.

Em geral, em bancos de dados, eu recomendo manter o tamanho que você precisa, porque você sempre pode expandir. Por exemplo, um colega no trabalho uma vez pensou que não há mal nenhum em usar o nvarchar(max) para uma coluna, já que não temos nenhum problema com o armazenamento. Mais tarde, quando tentamos aplicar um índice sobre essa coluna, o SQL Server rejeitou isso. Se, no entanto, ele começou mesmo com varchar(5) , poderíamos simplesmente expandi-lo depois para o que precisamos sem um problema que exigiria que fizéssemos um plano de migration de campo para corrigir esse problema.

Embora o NVARCHAR armazene o Unicode, você deve considerar pela ajuda do agrupamento também é possível usar o VARCHAR e salvar seus dados de seus idiomas locais.

Apenas imagine o seguinte cenário.

O agrupamento do seu database é persa e você salva um valor como ‘علی’ (escrita persa de Ali) no tipo de dados VARCHAR(10) . Não há problema e o SGBD usa apenas três bytes para armazená-lo.

No entanto, se você deseja transferir seus dados para outro database e ver o resultado correto, seu database de destino deve ter o mesmo agrupamento que o destino que é persa neste exemplo.

Se o seu agrupamento de destino for diferente, você verá alguns pontos de interrogação (?) No database de destino.

Finalmente, lembre-se se você estiver usando um database enorme que é para uso do seu idioma local, eu recomendaria usar o local em vez de usar muitos espaços.

Eu acredito que o design pode ser diferente. Depende do ambiente em que você trabalha.

Eu tenho que dizer aqui (eu percebo que eu provavelmente vou me abrir para um slating!), Mas certamente a única vez que NVARCHAR é realmente mais útil (note o mais lá!) Do que VARCHAR é quando todos os agrupamentos em todos os sistemas dependentes e dentro do próprio database são os mesmos …? Se não, então a conversão de agrupamento tem que acontecer de qualquer maneira e assim torna o VARCHAR tão viável quanto o NVARCHAR .

Para adicionar a isso, alguns sistemas de database, como o SQL Server (antes de 2012), têm um tamanho de página de aprox. 8K Então, se você está olhando para armazenar dados pesquisáveis ​​não mantidos em algo como um campo TEXT ou NTEXT , então VARCHAR fornece o valor total de 8k de espaço, enquanto NVARCHAR fornece apenas 4k (o dobro dos bytes, o dobro do espaço).

Suponho que, para resumir, o uso de qualquer um depende de:

  • Projeto ou contexto
  • A infraestrutura
  • Sistema de database

A principal diferença entre Varchar(n) e nvarchar(n) é: insira a descrição da imagem aqui

Varchar (Tamanho de comprimento variável, dados de caracteres não-Unicode) tamanho é até 8000. 1.It é um tipo de dados de comprimento variável

  1. Usado para armazenar caracteres não-Unicode

  2. Ocupa 1 byte de espaço para cada caractere

insira a descrição da imagem aqui

Nvarchar : dados de caracteres Unicode de tamanho variável.

1.É um tipo de dados de comprimento variável

2. Usado para armazenar caracteres Unicode.

  1. Os dados são armazenados em uma codificação Unicode. Todo idioma é suportado. (por exemplo, as línguas árabe, alemão, hindu, etc e assim por diante)

nvarchar é seguro para uso comparado ao varchar para tornar nosso código livre de erros (tipo incompatível) porque o nvarchar permite caracteres unicode. Quando usamos a condição where na consulta do SQL Server e se estivermos usando o operador = , isso gerará erros algumas vezes. A razão provável para isso é que nossa coluna de mapeamento será diferente em varchar . Se definimos em nvarchar este problema não acontece. Ainda assim, nos limitamos a varchar e evitamos esse problema. É melhor usar a palavra-chave LIKE ao invés de = .

    Intereting Posts