Suporte a agrupamentos e a Unicode

Os agrupamentos do SQL Server fornecem propriedades de regras de classificação, de diferenciação de maiúsculas e minúsculas e de diferenciação de acentos para seus dados. Os agrupamentos utilizados com tipos de dados de caractere, como char e varchar, determinam a página de código e os caracteres correspondentes que podem ser representados para esse tipo de dados. Independentemente de você estar instalando uma nova instância do SQL Server, restaurando um backup de banco de dados ou conectando o servidor a bancos de dados cliente, é importante estar ciente dos requisitos de localidade, ordem de classificação e distinção de maiúsculas e minúsculas e de acentos dos dados com os quais trabalhará. Para listar os agrupamentos disponíveis na instância do SQL Server, consulte sys.fn_helpcollations (Transact-SQL).

Ao selecionar um agrupamento para o servidor, banco de dados, coluna ou expressão, você atribui determinadas características a seus dados que afetam os resultados de muitas operações no banco de dados. Por exemplo, ao construir uma consulta usando ORDER BY, a ordem de classificação de seu conjunto de resultados pode depender do agrupamento aplicado ao banco de dados ou ditado em uma cláusula COLLATE no nível de expressão da consulta.

Para usar o suporte a agrupamentos do SQL Server da melhor maneira possível, você deve estar ciente dos termos definidos neste tópico e de como eles estão relacionados às características de seus dados.

Neste tópico

Condições do agrupamento

Suporte de Unicode

Caracteres complementares

Suporte a GB18030

Suporte a script complexo

Tarefas relacionadas

Conteúdo relacionado

Condições do agrupamento

  • Agrupamento

  • Localidade

  • Página de códigos

  • Ordem de classificação

Agrupamento

Um agrupamento especifica os padrões de bit que representam cada caractere em um conjunto de dados. Os agrupamentos também determinam as regras que classificam e comparam dados. O SQL Server oferece suporte ao armazenamento de objetos com agrupamentos diferentes em um único banco de dados. Para colunas não Unicode, a configuração de agrupamento especifica a página de códigos dos dados e quais caracteres podem ser representados. Os dados movidos entre colunas não Unicode devem ser convertidos da página de código de origem para a página de código de destino.

Os resultados da instrução Transact-SQL podem variar quando a instrução for executada no contexto de diferentes bancos de dados que tenham configurações de agrupamento diferentes. Se possível, use um agrupamento padronizado para sua organização. Deste modo, não será preciso especificar o agrupamento explicitamente em todo caractere ou expressão Unicode. Se você deve trabalhar com objetos que tenham configurações de agrupamento e página de códigos diferentes, codifique suas consultas para considerar as regras da precedência de agrupamento. Para obter mais informações, consulte Precedência de agrupamento (Transact-SQL).

As opções associadas a um agrupamento fazem diferenciação de maiúsculas e minúsculas, de caracteres Kana e de largura. Estas opções são especificadas através de sua anexação ao nome de agrupamento. Por exemplo, este agrupamento Japanese_Bushu_Kakusu_100_CS_AS_KS_WS tem diferenciação de maiúsculas e minúsculas, de acentos, de caracteres Kana e de largura. A tabela a seguir descreve o comportamento associado com estas opções.

Opção

Descrição

Case-sensitive (_CS)

Faz distinção entre letras maiúscula e minúsculas. Se selecionada, as letras minúsculas são ordenadas à frente das versões em letras maiúsculas. Se esta opção não for selecionada, o agrupamento será sem diferenciação de maiúsculas e minúsculas. Ou seja, o SQL Server considera as versões de letras maiúsculas e minúsculas como idênticas para fins de classificação. Você pode selecionar caso explicitamente a não diferenciação de maiúsculas e minúsculas especificando _CI.

Accent-sensitive (_AS)

Faz distinção entre caracteres acentuados e não acentuados. Por exemplo, 'a' não é igual a 'ã'. Se esta opção não for selecionada, o agrupamento não diferenciará acentos. Ou seja, o SQL Server considera as versões com e sem acentos como idênticas para fins de classificação. Você pode selecionar a não diferenciação de acentos especificando _AI.

Kana-sensitive (_KS)

Distingue entre os dois tipos de caracteres kana japoneses: hiragana e katakana. Se esta opção não for selecionada, o agrupamento será sem diferenciação de caracteres kana. Ou seja, o SQL Server considera que caracteres hiragana e katakana são iguais para fins de classificação. A omissão desta opção é o único método de especificar a não diferenciação de Kana.

Width-sensitive (_WS)

Distingue entre caracteres de largura inteira e meia largura. Se esta opção não for selecionada, o SQL Server considerará as representações de largura inteira e meia largura do mesmo caractere como iguais para fins de classificação. A omissão desta opção é o único método de especificar a não diferenciação de largura.

O SQL Server oferece suporte aos seguintes conjuntos de agrupamento:

  • Agrupamentos do Windows
    Os agrupamentos do Windows definem regras para o armazenamento de dados de caractere baseadas em uma localidade de sistema do Windows associada. No caso de um agrupamento do Windows, a comparação de dados não Unicode é implementada usando o mesmo algoritmo que os dados Unicode. As regras de base de agrupamentos do Windows especificam qual alfabeto ou idioma será usado quando a classificação de dicionário for aplicada, bem como a página de código usada para armazenar dados de caracteres não Unicode. As classificações Unicode e não Unicode são compatíveis com comparações de cadeias de caracteres em uma versão específica do Windows. Isso proporciona consistência entre os tipos de dados no SQL Server e também permite que os desenvolvedores classifiquem as cadeias de caracteres nos aplicativos usando as mesmas regras utilizadas pelo SQL Server. Para obter mais informações, consulte Nome de agrupamento do Windows (Transact-SQL).

  • Agrupamentos binários
    Os agrupamentos binários classificam os dados com base na sequência de valores codificados definidos pela localidade e pelo tipo de dados. Eles fazem diferenciação de maiúsculas e minúsculas. Um agrupamento binário no SQL Server define a localidade e a página de código ANSI que serão usados. Isso impõe uma ordem de classificação binária. Como são relativamente simples, os agrupamentos binários ajudam melhorar o desempenho de aplicativo. Para tipos de dados não Unicode, as comparações de dados têm como base os pontos de código definidos na página de código ANSI. Para tipos de dados Unicode, as comparações de dados têm como base os pontos de código Unicode. Para agrupamentos binários em tipos de dados Unicode, a localidade não é considerada em classificações de dados. Por exemplo, Latin_1_General_BIN e Japanese_BIN geram resultados de classificação idênticos quando usados em dados Unicode.

    Existem dois tipos de agrupamentos binários no SQL Server; os agrupamentos mais antigos BIN e os agrupamentos mais novos BIN2. Em um agrupamento BIN2 todos os caracteres são classificados de acordo com seus pontos de código. Em um agrupamento BIN apenas o primeiro caractere é classificado de acordo com o ponto de código e os caracteres restantes são classificados de acordo com seus valores de byte. (Como a plataforma Intel é uma arquitetura little endian, os caracteres de código Unicode são sempre armazenados com bytes trocados.)

  • Agrupamentos do SQL Server
    Os agrupamentos (SQL_*) do SQL Server oferecem compatibilidade de ordem de classificação com versões anteriores do SQL Server. As regras de classificação de dicionário para dados não Unicode são incompatíveis com rotinas de classificação fornecidas pelos sistemas operacionais Windows. No entanto, a classificação de dados Unicode é compatível com uma versão específica das regras de classificação do Windows. Como os agrupamentos do SQL Server usam regras de comparação diferentes para dados não Unicode e Unicode, você verá resultados diferentes para comparações dos mesmos dados, dependendo do tipo de dados subjacente. Para obter mais informações, consulte Nome de agrupamento do SQL Server (Transact-SQL).

    ObservaçãoObservação

    Quando você atualiza uma instância em português do SQL Server, os agrupamentos (SQL_*) do SQL Server podem ser especificados para compatibilidade com instâncias existentes do SQL Server. Como o agrupamento padrão de uma instância do SQL Server é definido durante a instalação, é importante especificar as configurações de agrupamento com cuidado quando as seguintes afirmações forem verdadeiras:

    • Seu código de aplicativo depende do comportamento de agrupamentos anteriores do SQL Server.

    • Você deve armazenar dados de caractere que refletem vários idiomas.

Há suporte para configurar agrupamentos nos seguintes níveis de uma instância do SQL Server:

  • Agrupamentos no nível do servidor
    O agrupamento do servidor padrão é definido durante a instalação do SQL Server e também se torna o agrupamento padrão dos bancos de dados do sistema e de todos os bancos de dados de usuário. Observe que os agrupamentos somente Unicode não podem ser selecionados durante a instalação do SQL Server, pois eles não são suportados como agrupamentos no nível de servidor.

    Depois que um agrupamento for atribuído ao servidor, você não poderá alterar o agrupamento, exceto exportando todos os objetos de banco de dados e dados, recriando o banco de dados master e importando todos os objetos de banco de dados e dados. Em vez de alterar o agrupamento padrão de uma instância do SQL Server, você pode especificar o agrupamento desejado no momento da criação de um novo banco de dados ou coluna de banco de dados.

  • Agrupamentos do nível do banco de dados
    Quando um banco de dados é criado ou modificado, você pode usar a cláusula COLLATE da instrução CREATE DATABASE ou ALTER DATABASE para especificar o agrupamento de banco de dados padrão. Se nenhum agrupamento for especificado, o banco de dados receberá o agrupamento do servidor.

    Você não pode alterar o agrupamento de bancos de dados do sistema, exceto alterando o agrupamento para o servidor.

    O agrupamento de banco de dados é usado para todos os metadados no banco de dados e é o padrão para todas as colunas de cadeia de caracteres, objetos temporários, nomes de variável e quaisquer outras cadeias de caracteres usadas no banco de dados. Quando você muda o agrupamento de um banco de dados de usuário, pode haver conflitos de agrupamento quando consultas no banco de dados acessarem tabelas temporárias. Sempre são armazenadas tabelas temporárias no banco de dados do sistema tempdb que usará o agrupamento para a instância. Consultas que comparam dados de caractere entre o banco de dados de usuário e tempdb poderão falhar se os agrupamentos causarem um conflito ao avaliar os dados de caractere. Você pode resolver isso especificando a cláusula COLLATE na consulta. Para obter mais informações, consulte COLLATE (Transact-SQL).

  • Agrupamentos em nível de coluna
    Quando você cria ou altera uma tabela, pode especificar agrupamentos para cada coluna de cadeia de caracteres usando a cláusula COLLATE. Se nenhum agrupamento for especificado, o agrupamento padrão do banco de dados será atribuído à coluna.

  • Agrupamentos no nível da expressão
    Os agrupamentos no nível de expressão são definidos quando uma instrução é executada e afetam o modo como um conjunto de resultados é retornado. Isso permite que os resultados da classificação ORDER BY sejam específicos de localidade. Use uma cláusula COLLATE como a seguinte para implementar agrupamentos no nível da expressão:

    SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
    

Voltar ao início

Localidade

Uma localidade é um conjunto de informações associadas a um local ou a uma cultura. Essas informações podem incluir o nome e o identificador do idioma falado, o script usado para escrever o idioma e as convenções culturais. Os agrupamentos podem ser associados a uma ou mais localidades. Para obter mais informações, consulte o artigo sobre IDs de localidade atribuídas pela Microsoft.

Voltar ao início

Página de Código

Uma página de código é um conjunto de caracteres ordenado de um determinado script no qual um índice numérico ou valor de ponto de código é associado a cada caractere. Uma página de códigos do Windows geralmente é referenciada como um conjunto de caracteres ou um charset. As páginas de código são usadas para oferecer suporte aos conjuntos de caracteres e layouts de teclado usados por diferentes localidades de sistema do Windows.

Voltar ao início

Ordem de Classificação

A ordem de classificação especifica como os valores de dados são classificados. Isso afeta os resultados da comparação de dados. Os dados são classificados com o uso de agrupamentos e podem ser otimizados com o uso de índices.

Voltar ao início

Suporte de Unicode

O Unicode é um padrão para mapear pontos de código para caracteres. Como é projetado para abranger todos os caracteres de todos os idiomas do mundo, não necessita de páginas de código diferentes para lidar com os diferentes conjuntos de caracteres. Se você armazenar dados de caractere que refletem vários idiomas, sempre use tipos de dados Unicode (nchar, nvarchar e ntext) em vez dos tipos de dados não Unicode (char, varchar e text).

Limitações consideráveis estão associadas a tipos de dados não Unicode. Isso ocorre porque um computador não Unicode fica limitado a usar uma única página de código. Você pode experimentar ganho de desempenho com o uso de Unicode, porque menos conversões de página de código são necessárias. Os agrupamentos Unicode devem ser selecionados individualmente no nível de banco de dados, coluna ou expressão porque não têm suporte no nível de servidor.

As páginas de código usadas por um cliente são determinadas pelas configurações do sistema operacional. Para definir páginas de código de cliente no sistema operacional Windows, use Configurações Regionais no Painel de Controle.

Quando você move dados de um servidor para um cliente, o agrupamento do servidor pode não ser reconhecido por drivers de cliente mais antigos. Isso pode ocorrer quando você move dados de um servidor Unicode para um cliente não Unicode. A melhor opção pode ser atualizar o sistema operacional do cliente para que os agrupamentos de sistema subjacentes sejam atualizados. Se houver um software de cliente de banco de dados instalado no cliente, você deverá considerar a possibilidade de aplicar uma atualização de serviço a esse software.

Você também pode tentar usar um agrupamento diferente para os dados no servidor. Escolha um agrupamento que será mapeado para uma página de código no cliente.

Para usar agrupamentos UTF-16 disponíveis no SQL Server 2012, selecione um do agrupamentos _SC de caracteres suplementares (somente agrupamentos do Windows) para melhorar a pesquisa e a classificação de alguns caracteres Unicode.

Para avaliar os problemas relacionados ao uso de tipos de dados Unicode ou não Unicode, teste seu cenário para medir as diferenças de desempenho em seu ambiente. Uma boa prática é padronizar o agrupamento usado nos sistemas de sua organização e implantar servidores e clientes Unicode sempre que possível.

Na maioria das situações, o SQL Server irá interagir com outros servidores ou clientes, e sua organização poderá usar vários padrões de acesso a dados entre aplicativos e instâncias de servidor. Clientes SQL Server são de um destes dois tipos principais:

  • Clientes Unicode que usam OLE DB e ODBC versão 3.7 ou posterior.

  • Clientes não Unicode que usam DB-Library e ODBC versão 3.6 ou anterior.

A tabela a seguir fornece informações sobre como usar dados multilíngues com várias combinações de servidores Unicode e não Unicode.

Servidor

Cliente

Benefícios ou limitações

Unicode

Unicode

Como os dados Unicode serão usados em todo o sistema, este cenário fornece o melhor desempenho e proteção contra danos de dados recuperados. É isso que acontece com ADO (ActiveX Data Objects), OLE DB e ODBC versão 3.7 ou posterior.

Unicode

Não Unicode

Neste cenário, principalmente em conexões entre um servidor que executa um sistema operacional mais recente e um cliente com uma versão mais antiga do SQL Server ou em um sistema operacional mais antigo, pode haver limitações ou erros quando você move os dados para um computador cliente. Os dados Unicode no servidor tentarão mapear para uma página de código correspondente no cliente não Unicode para converter os dados.

Não Unicode

Unicode

Esta não é uma configuração ideal para usar dados multilíngues. Não é possível gravar dados Unicode no servidor não Unicode. É provável que ocorram problemas quando os dados forem enviados para servidores que estejam fora da página de código do servidor.

Não Unicode

Não Unicode

Este é um cenário muito limitado para dados multilíngues. Você pode usar uma única página de código.

Voltar ao início

Caracteres complementares

O SQL Server fornece os tipos de dados como nchar e nvarchar para armazenar dados Unicode. Esses tipos de dados codificam texto em um formato chamado UTF-16. O Consórcio Unicode aloca para cada caractere um ponto de código exclusivo, que é um valor no intervalo de 0x0000 a 0x10FFFF. Os caracteres mais frequentemente usados têm valores de ponto de código que se ajustarão em uma palavra de 16 bits na memória e no disco, mas os caracteres com ponto de código maiores que 0xFFFF exigem duas palavras de 16 bits consecutivas. Esses caracteres são chamados de caracteres suplementares e as duas palavras de 16 bits consecutivas são chamadas de pares substitutos.

Se você usar caracteres suplementares:

  • Caracteres suplementares podem ser usados apenas em operações de comparação e ordenação em versões de agrupamento 90 ou superior.

  • Todos os agrupamentos de nível _100 oferecem suporte à classificação linguística com caracteres suplementares.

  • Os caracteres suplementares não têm suporte para uso em metadados, como em nomes de objetos de banco de dados.

  • Lançada no SQL Server 2012, uma nova família de agrupamentos de SC (caracteres suplementares) pode ser usada com os tipos de dados nchar, nvarchar e sql_variant. Por exemplo: Latin1_General_100_CI_AS_SC ou ao usar um agrupamento japonês, Japanese_Bushu_Kakusu_100_CI_AS_SC.

    O sinalizador de SC pode ser aplicado a:

    • Agrupamentos do Windows na versão 90

    • Agrupamentos do Windows na versão 100

    O sinalizador de SC não pode ser aplicado a:

    • Agrupamentos do Windows sem versão na versão 80

    • Os agrupamentos binários BIN ou BIN2

    • Os agrupamento do SQL*

A tabela a seguir compara o comportamento de alguns operadores e funções de cadeia de caracteres quando eles usam caracteres suplementares com e sem um agrupamento de SC.

Função ou operador de cadeia de caracteres

Com um agrupamento de SC

Sem um agrupamento de SC

CHARINDEX

LEN

PATINDEX

O par substituto UTF-16 é contado como um único ponto de código.

O par substituto UTF-16 é contado como dois pontos de código.

LEFT

REPLACE

REVERSE

RIGHT

SUBSTRING

STUFF

Essas funções tratam cada par substituto como um único ponto de código e funcionam conforme o esperado.

Essas funções podem dividir qualquer par substituto e levar a resultados inesperados.

NCHAR

Retorna o caractere que corresponde ao valor de ponto de código Unicode especificado no intervalo de 0 a 0x10FFFF. Se o valor especificado estiver no intervalo de 0 a 0xFFFF, será retornado um caractere. Para valores mais altos, é retornado o substituto correspondente.

Um valor mais alto que 0xFFFF retorna NULL, em vez do substituto correspondente.

UNICODE

Retorna um ponto de código UTF-16 no intervalo de 0 a 0x10FFFF.

Retorna um ponto de código UCS-2 no intervalo de 0 a 0xFFFF.

Corresponder um caractere curinga

Curinga – caracter(es) não correspondem

Há suporte para caracteres suplementares para todas as operações de curingas.

Não há suporte para caracteres suplementares para estas operações de curingas. Há suporte para outros operadores curinga.

Voltar ao início

Suporte a GB18030

GB18030 é um padrão separado usado na República Popular da China para codificar caracteres chineses. Em GB18030, caracteres podem ter 1, 2 ou 4 bytes em comprimento. O SQL Server oferece suporte a caracteres GB18030 codificados, reconhecendo-os quando eles entram no servidor, provenientes de um aplicativo cliente, convertendo-os e armazenando-os nativamente como caracteres Unicode. Após serem armazenados no servidor, são tratados como caracteres Unicode em todas as operações subsequentes. Você pode usar qualquer agrupamento chinês, preferivelmente a mais recente versão 100. Todos os agrupamentos de nível _100 dão suporte à classificação linguística com caracteres GB18030. Se os dados incluírem caracteres suplementares (pares alternativos), você poderá usar os agrupamentos de SC disponíveis no SQL Server 2012 para aprimorar a pesquisa e a classificação.

Voltar ao início

Suporte a script complexo

O SQL Server oferece suporte à inserção, armazenamento, alteração e exibição de scripts complexos. Scripts complexos incluem o seguinte:

  • Scripts que incluem uma combinação de texto da direita para a esquerda e da esquerda para a direita, como uma combinação de texto em árabe e inglês.

  • Scripts cujos caracteres alteram de forma de acordo com sua posição ou quando combinados com outros caracteres, como caracteres árabes, índicos e tailandeses.

  • Idiomas como tailandês que exigem dicionários internos reconhecer palavras porque não há nenhuma quebra entre eles.

Aplicativos de banco de dados que interagem com o SQL Server devem usar controles que oferecem suporte a scripts complexos. Controles de formulário padrão do Windows que são criados em código gerenciado são habilitados para script complexo.

Voltar ao início

Tarefas relacionadas

Tarefa

Tópico

Descreve como definir ou alterar o agrupamento da instância de SQL Server.

Definir ou alterar o agrupamento do servidor

Descreve como definir ou alterar o agrupamento de um banco de dados de usuário.

Definir ou alterar o agrupamento de banco de dados

Descreve como definir ou alterar o agrupamento de uma coluna no banco de dados.

Definir ou alterar o agrupamento de coluna

Descreve como retornar informações de agrupamento ao servidor, banco de dados ou nível de coluna.

Exiba informações de agrupamento

Descreve como escrever instruções Transact-SQL que os farão mais portátil de um idioma para outro, ou oferece suporte a vários idiomas mais facilmente.

Gravar instruções Transact-SQL internacionais

Descreve como alterar o idioma de mensagens de erro e preferências de como data, hora e dados de moeda são usados e exibidos.

Definir um idioma de sessão

Voltar ao início

Conteúdo relacionado

Práticas recomendadas para alteração em agrupamentos do SQL Server

"Práticas recomendadas para migração para Unicode no SQL Server"

Site de consórcio Unicode

Consulte também

Referência

sys.fn_helpcollations (Transact-SQL)

Conceitos

Agrupamentos de banco de dados contidos

Escolher um idioma ao criar um índice de texto completo