Pergunta

Trata-se apenas que os caracteres suportes nvarchar vários bytes? Se for esse o caso, há realmente qualquer ponto, diferente de preocupações de armazenamento, a usar varchars?

Foi útil?

Solução

Uma coluna nvarchar pode armazenar todos os dados Unicode. Uma coluna varchar é restrita a uma página de código de 8 bits. Algumas pessoas pensam que varchar deve ser usado porque ele ocupa menos espaço. Eu acredito que esta não é a resposta correta. incompatabilities página de código são uma dor, e Unicode é a cura para problemas de página de códigos. Com o disco barato e memória hoje em dia, não há realmente nenhuma razão para desperdiçar tempo perder tempo com páginas de código mais.

Todos os modernos sistemas operacionais e plataformas de desenvolvimento usar Unicode internamente. Usando nvarchar em vez de varchar, você pode evitar fazer conversões que codificam cada vez que você ler ou escrever para o banco de dados. Conversões levar tempo, e são propensos a erros. E recuperação de erros de conversão é um problema não-trivial.

Se você está interagindo com um aplicativo que usa apenas ASCII, eu ainda recomendo usar Unicode no banco de dados. O sistema operacional e banco de dados algoritmos de agrupamento irá trabalhar melhor com Unicode. Unicode evita problemas de conversão quando a interface com outros sistemas. E você vai estar se preparando para o futuro. E você sempre pode validar que seus dados estão restritos a ASCII de 7 bits para qualquer sistema legado que você está tendo de manter, mesmo enquanto desfruta de alguns dos benefícios do armazenamento completo Unicode.

Outras dicas

varchar : de comprimento variável , dados de caracteres não-Unicode. Os determina agrupamento de banco de dados que a página de código que os dados são armazenados usando.

nvarchar : de comprimento variável dados de caracteres Unicode. Dependente do agrupamento de banco para comparações.

Com este conhecimento, use a que corresponde ao seu dados de entrada (ASCII v. Unicode).

Eu uso sempre nvarchar, pois permite que qualquer coisa que eu estou construindo para suportar praticamente todos os dados que eu jogar nele. Meu sistema CMS faz chinesa por acidente, porque eu usei nvarchar. Estes dias, quaisquer novas aplicações realmente não deve se preocupar com a quantidade de espaço necessário.

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

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, basta ir para ela. Caso contrário, ou se você não tem controle sobre o conjunto de caracteres Oracle, continue a ler.

VARCHAR - Os dados são armazenados na codificação NLS_CHARACTERSET. Se houver outras instâncias de banco de dados no mesmo servidor, você pode ser restringido por eles; e vice-versa, desde que você tem que compartilhar a configuração. Esse campo pode armazenar todos os dados que podem ser codificados usando esse conjunto de caracteres, e nada mais . Por exemplo, se o conjunto de caracteres é MS-1252, você só pode armazenar caracteres como letras inglesas, um punhado de letras acentuadas, e alguns outros (como € e -). Sua aplicação seria útil apenas para algumas localidades, incapazes de operar em qualquer outro lugar no mundo. Por esta razão, ele é considerado uma má idéia.

NVARCHAR - Os dados são armazenados em uma codificação Unicode. Toda linguagem é suportado. Uma boa idéia.

espaço de armazenamento Sobre o quê? VARCHAR é geralmente eficiente, uma vez que o conjunto de caracteres / codificação foi customizado para um local específico. NVARCHAR campos armazenar tanto em UTF-8 ou UTF-16, a base sobre os NLS configuração ironicamente. UTF-8 é muito eficiente para idiomas "ocidentais", enquanto ainda suporte a idiomas asiáticos. UTF-16 é muito eficiente para idiomas asiáticos, enquanto ainda apoiar línguas "ocidentais". Se preocupar com espaço de armazenamento, escolher um NLS configuração para causar Oracle para uso UTF-8 ou UTF-16 conforme o caso.

O que sobre o processamento de velocidade? A maioria das plataformas de codificação novos usar Unicode nativamente (Java, .NET, mesmo C ++ std :: wstring de anos atrás!) Por isso, se o campo de banco de dados é VARCHAR ele força Oracle para converter entre conjuntos de caracteres em cada ler ou escrever, não tão bom. Usando NVARCHAR evita a conversão.

A linha inferior: Use NVARCHAR! Ele evita limitações e dependências, é bom para o espaço de armazenamento, e, geralmente, melhor para o desempenho também.

lojas nvarchar dados como Unicode, por isso, se você estiver indo para armazenar dados multilingue (mais de um idioma) em uma coluna de dados que você precisa a variante N.

Os meus dois centavos

  1. Os índices podem falhar quando não estiver usando os tipos de dados corretos:
    Em SQL Server: Quando você tem um índice sobre uma coluna VARCHAR e apresentá-lo de uma seqüência de caracteres Unicode, o SQL Server não faz uso do índice. A mesma coisa acontece quando você apresentar um BigInt a uma coluna indexada contendo Smallint. Mesmo que o BigInt é pequeno o suficiente para ser um SMALLINT, o SQL Server não é capaz de usar o índice. O contrário você não tem este problema (ao fornecer Smallint ou Ansi-Code a um BigInt indexados ot coluna NVARCHAR).

  2. tipos de dados podem variar entre diferentes das DBMS (DataBase Management System):
    Sabemos que cada banco de dados tem um pouco diferentes tipos de dados e não VARCHAR não significa a mesma em toda parte. Enquanto SQL Server tem VARCHAR e NVARCHAR, um banco de dados Apache / Derby tem apenas VARCHAR e não VARCHAR está em Unicode.

Principalmente nvarchar lojas de caracteres Unicode e varchar lojas de caracteres não-Unicode.

meios "Unicodes" 16-bit esquema de codificação de caracteres que permite caracteres de muitas outras línguas como árabe, hebraico, chinês, japonês, de ser codificado em um único conjunto de caracteres.

Isso significa Unicodes está usando 2 bytes por caractere para armazenar e nonunicodes usa apenas um byte por caractere para armazenar. Que meios Unicodes precisa dupla capacidade para armazenar comparação aos não-Unicodes.

Você tem razão. lojas nvarchar dados Unicode, enquanto lojas varchar dados de caracteres de byte único. Outros que diferenças de armazenamento (nvarchar requer o dobro do espaço de armazenamento como varchar), que você já mencionadas, a principal razão para preferir nvarchar sobre varchar seria internacionalização (ou seja, armazenar strings em outras línguas).

Eu diria, isso depende.

Se você desenvolver um aplicativo de desktop, onde o sistema operacional funciona em Unicode (como todos os sistemas atuais do Windows) e linguagem suporta nativamente Unicode (cordas padrão são Unicode, como em Java ou C #), então vá nvarchar.

Se você desenvolver uma aplicação web, onde as cadeias entrar como UTF-8, ea linguagem é PHP, que ainda não suporta Unicode nativamente (nas versões 5.x), então varchar vai provavelmente ser uma escolha melhor.

nVarChar irá ajudá-lo para armazenar caracteres Unicode. É o caminho a percorrer se você deseja armazenar dados localizados.

Se um único byte é usado para armazenar um personagem, existem 256 combinações possíveis, e, assim, você pode economizar 256 caracteres diferentes. Agrupamento é o padrão que define os personagens 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 muitas línguas. Por exemplo, alguns idiomas asiáticos têm milhares de caracteres, para que eles devem usar dois bytes por caractere.

padrão Unicode

Quando os sistemas que utilizam múltiplas páginas de código são usados ??em uma rede, torna-se difícil de gerir a comunicação. Para padronizar as coisas, o consórcio ISO e Unicode introduziu o Unicode . Unicode usa dois bytes para armazenar cada personagem. Isso é 65.536 caracteres diferentes podem ser definidas, por isso quase todos os personagens podem ser cobertos com Unicode. Se dois computadores usam Unicode, cada símbolo será representado da mesma maneira e nenhuma conversão é necessária -. Esta é a idéia por trás Unicode

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

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

Se precisamos salvar dados de caracteres de vários países, sempre use Unicode.

Apesar de lojas NVARCHAR Unicode, você deve considerar com a ajuda de agrupamento também pode utilizar VARCHAR e salvar seus dados de seus idiomas locais.

Imagine o seguinte cenário.

A colação de sua DB é persa e você salvar um valor como '???' (escrita persa de Ali) no tipo de dados VARCHAR(10). Não há nenhum problema eo DBMS só usa três bytes para armazená-lo.

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

Se o seu agrupamento alvo é diferente, você vê alguns pontos de interrogação (?) No banco de dados de destino.

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

Eu acredito que o projeto pode ser diferente. Depende do ambiente que você trabalhar.

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

Para adicionar a isso, alguns sistemas de banco de dados, tais como SQL Server (antes de 2012) têm um tamanho de página de aprox. 8K. Então, se você está olhando para o armazenamento de dados pesquisáveis ??não detidas em algo como um campo TEXT ou NTEXT então VARCHAR fornece a pena de espaço a plena 8k da enquanto NVARCHAR só fornece 4k (o dobro de bytes, o dobro do espaço).

suponho, para resumir, o uso de um ou outro depende:

  • Project ou contexto
  • Infra-estrutura
  • sistema de banco de dados

Siga diferença entre o SQL Server VARCHAR e NVARCHAR de dados tipo de . Aqui você pode ver de uma forma muito descritivo.

Em armazena dados generalnvarchar como Unicode, por isso, se você estiver indo para armazenar dados multilingue (mais de um idioma) em uma coluna de dados que você precisa a variante N.

Eu tinha um olhar para as respostas e muitos parecem recomendamos usar nvarchar sobre varchar, porque o espaço não é mais um problema, então não há mal nenhum em permitir Unicode para armazenamento extra. Bem, isso nem sempre é verdadeiro quando você deseja aplicar um índice sobre sua coluna. SQL Server tem um limite de 900 bytes no tamanho do campo 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, então você pode indexar até nvarchar(450). Então, se você está confiante de que você não precisa nvarchar, eu não recomendo usá-lo.

Em geral, em bases de dados, eu recomendo ficar com o tamanho que você precisa, porque você sempre pode expandir. Por exemplo, um colega de trabalho que se pensava que não há nenhum mal em usar nvarchar(max) para uma coluna, como não temos nenhum problema com o armazenamento em tudo. Mais tarde, quando tentamos aplicar um índice sobre esta coluna, o SQL Server rejeitou esta. Se, no entanto, ele começou com varchar(5) mesmo, poderíamos ter simplesmente expandiu-lo mais tarde para o que precisamos sem um problema tão grande que nos obrigará a fazer um plano de migração campo para corrigir esse problema.

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

Varchar (Variable-length, 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 personagem

enter descrição da imagem aqui

Nvarchar:. Dados de caracteres de comprimento variável Unicode

1.It é um tipo de dados de comprimento variável

2.Used para armazenar caracteres Unicode.

  1. Os dados são armazenados em uma codificação Unicode. Cada idioma é suportado. (Por exemplo, as línguas Árabe, Alemão, Hindi, etc e assim por diante)

Jeffrey L Whitledge com ~ 47000 pontuação de reputação recomenda o uso de nvarchar

Solomon Rutzky com com ~ pontuação 33200 reputação recomenda: Não use sempre NVARCHAR. Essa é uma, atitude / abordagem muito perigoso, e muitas vezes caro.

Quais são o desempenho principal diferenças entre varchar e nvarchar tipos de dados do SQL Server?

https://www.sqlservercentral.com/articles/disk -é-barato-Orly-4

As duas pessoas de uma alta reputação, o que faz um desenvolvedor de banco de dados servidor de aprendizagem sql escolher?

Existem muitos avisos em respostas e comentários sobre problemas de desempenho se você não são consistentes nas escolhas.

Há comentários Pro / con nvarchar para o desempenho.

Há comentários Pro / con varchar para o desempenho.

Eu tenho um requisito específico para uma tabela com muitas centenas de colunas, que em si é provavelmente incomum?

Eu estou escolhendo varchar para evitar ir perto do 8060 byte registro da tabela limite de tamanho de SQL * Server 2012.

O uso de nvarchar, para mim, vai acima deste limite 8060 byte.

Eu também estou pensando que eu deveria coincidir com os tipos de dados das tabelas de códigos relacionados aos tipos de dados da mesa central primária.

Eu vi utilização da coluna varchar neste local de trabalho, Sul governo australiano, por desenvolvedores anteriores experientes banco de dados, onde a contagem de linha da tabela vai ser vários milhões ou mais (e muito poucas colunas nvarchar, se houver, em essas tabelas muito grandes), então talvez os volumes linha de dados esperados torna-se parte desta decisão.

nvarchar é seguro para uso em comparação com varchar a fim de fazer o nosso erro de código livre (tipo de descasamento) porque nvarchar permite caracteres Unicode também. Quando usamos condição where na consulta SQL Server e se estamos usando operador =, ele irá lançar erros algumas vezes. razão provável para isso é a nossa coluna mapeamento será difined em varchar. Se nós definimos em nvarchar este problema não o meu acontecer. Ainda nos ater ao varchar e evitar esse problema é melhor palavra-chave uso LIKE em vez de =.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top