Suporte a agrupamento e Unicode
Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)ponto de extremidade de análise SQL no Microsoft FabricWarehouse no Microsoft Fabric
Os agrupamentos no SQL Server fornecem regras de classificação e propriedades de sensibilidade a maiúsculas e minúsculas e a acentos para os seus dados. Os agrupamentos usados com tipos de dados de caracteres, como char e varchar, ditam a página de código e os caracteres correspondentes que podem ser representados para esse tipo de dados.
Não importa se você está 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 entender os requisitos de localidade, a ordem de classificação e a sensibilidade de maiúsculas e minúsculas e acentos dos dados com os quais você está trabalhando. Para listar os agrupamentos disponíveis em sua instância do SQL Server, consulte sys.fn_helpcollations.
Ao selecionar um agrupamento para seu servidor, banco de dados, coluna ou expressão, você está atribuindo determinadas características aos seus dados. Essas características afetam os resultados de muitas operações no banco de dados. Por exemplo, quando você constrói uma consulta usando ORDER BY
, a ordem de classificação do 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 melhor usar o suporte a agrupamento no SQL Server, você deve entender os termos definidos neste artigo e como eles se relacionam com as características dos seus dados.
Termos de agrupamento
Colação
Um agrupamento especifica os padrões de bits que representam cada caractere em um conjunto de dados. Os agrupamentos também determinam as regras que classificam e comparam dados. O SQL Server dá 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ódigo para os dados e quais caracteres podem ser representados. Os dados que você move entre colunas não-Unicode devem ser convertidos da página de código-fonte para a página de código de destino.
Transact-SQL resultados da instrução podem variar quando a instrução é executada no contexto de diferentes bancos de dados que têm configurações de agrupamento diferentes. Se possível, use um agrupamento padronizado para sua organização. Dessa forma, você não precisa especificar o agrupamento em cada caractere ou expressão Unicode. Se você precisar trabalhar com objetos que tenham configurações de agrupamento e página de código diferentes, codifique suas consultas para considerar as regras de precedência de agrupamento. Para obter mais informações, consulte Precedência de agrupamento.
As opções associadas a um agrupamento são sensibilidade a maiúsculas e minúsculas, sensibilidade de acento, sensibilidade kana, sensibilidade de largura e sensibilidade do seletor de variação. O SQL Server 2019 (15.x) apresenta uma opção adicional para codificação UTF-8.
Você pode especificar essas opções acrescentando-as ao nome do agrupamento. Por exemplo, a classificação Japanese_Bushu_Kakusu_100_CS_AS_KS_WS_SC_UTF8
é sensível a maiúsculas, a acentos, a kana, a largura e é codificada em UTF-8. Como outro exemplo, o agrupamento Japanese_Bushu_Kakusu_140_CI_AI_KS_WS_VSS
é insensível a maiúsculas e minúsculas, insensível a acentos, sensível a kana, sensível à largura, sensível ao seletor de variações e usa uma página de código herdada para varchar.
O comportamento associado a essas várias opções é descrito na tabela a seguir:
Opção | Descrição |
---|---|
Sensível a maiúsculas e minúsculas (_CS) | Distingue entre letras maiúsculas e minúsculas. Se essa opção estiver selecionada, as letras minúsculas classificam antes de suas versões maiúsculas. Se essa opção não estiver selecionada, a ordenação não diferenciará maiúsculas de minúsculas. Ou seja, o SQL Server considera as versões maiúsculas e minúsculas das letras idênticas para fins de classificação. Você pode selecionar explicitamente a insensibilidade a maiúsculas e minúsculas ao especificar _CI. |
Sensível a acentos (_AS) | Distingue entre caracteres acentuados e não acentuados. Por exemplo, a não é igual a ấ . Se essa opção não estiver selecionada, o agrupamento não diferenciará acentos. Ou seja, o SQL Server considera as versões acentuadas e não acentuadas das letras idênticas para fins de classificação. Você pode selecionar explicitamente a insensibilidade ao acento especificando _AI. |
Sensível ao Kana (_KS) | Distingue entre os dois tipos de caracteres kana japoneses: Hiragana e Katakana. Se essa opção não estiver selecionada, o agrupamento será insensível a kana. Ou seja, o SQL Server considera os caracteres Hiragana e Katakana iguais para fins de classificação. Omitir esta opção é a única forma de especificar a insensibilidade a diferenças entre kana. |
Sensível à largura (_WS) | Distingue entre caracteres de largura total e de meia largura. Se essa opção não estiver selecionada, o SQL Server considerará a representação de largura total e meia largura do mesmo caractere idêntica para fins de classificação. Omitir essa opção é o único método de especificar a insensibilidade à largura. |
Sensível ao seletor de variantes (_VSS) | Distingue entre vários seletores de variação ideográfica nos agrupamentos japoneses Japanese_Bushu_Kakusu_140 e Japanese_XJIS_140 , que são introduzidos no SQL Server 2017 (14.x). Uma sequência de variação consiste em um caractere base mais um seletor de variação. Se essa opção de _VSS não estiver selecionada, o agrupamento será insensível ao seletor de variação, e o seletor de variação não será considerado na comparação. Ou seja, o SQL Server considera que os caracteres criados sobre o mesmo caractere base com diferentes seletores de variação são idênticos para fins de classificação. Para obter mais informações, consulte Unicode Ideographic Variation Database.Não há suporte para agrupamentos sensíveis a variações (_VSS) em índices de pesquisa de texto completo. Os índices de pesquisa de texto completo suportam apenas as opções Accent-Sensitive (_AS), Kana-sensitive (_KS) e Width-sensitive (_WS). Os mecanismos de de integração do SQL Server XML e do |
Binário (_BIN) 1 | Classifica e compara dados em tabelas do SQL Server com base nos padrões de bits definidos para cada caractere. A ordem de classificação binária é sensível a maiúsculas e minúsculas e a acentos. Binary também é a ordem de classificação mais rápida. Para obter mais informações, consulte a seção agrupamentos binários neste artigo. |
Ponto de código binário (_BIN2) 1 | Classifica e compara dados em tabelas do SQL Server com base em pontos de código Unicode para dados Unicode. Para dados não-Unicode, o ponto de código binário usa comparações idênticas às de classificações binárias. A vantagem de usar uma ordem de classificação de pontos de código binário é que não é necessário reordenar os dados em aplicações que comparam dados ordenados do SQL Server. Como resultado, uma ordem de classificação de pontos de código binário fornece desenvolvimento de aplicativos mais simples e possíveis aumentos de desempenho. Para obter mais informações, consulte a seção agrupamentos binários neste artigo. |
UTF-8 (_UTF8) | Permite que dados codificados UTF-8 sejam armazenados no SQL Server. Se essa opção não estiver selecionada, o SQL Server usará o formato de codificação não-Unicode padrão para os tipos de dados aplicáveis. Para obter mais informações, consulte a seção UTF-8 Support neste artigo. |
1 Se o ponto de código binário ou binário estiver selecionado, as opções Diferencia maiúsculas de minúsculas (_CS), Acento (_AS), Kana (_KS) e Largura (_WS) não estarão disponíveis.
Exemplos de opções de agrupamento
Cada agrupamento é combinado como uma série de sufixos para definir a sensibilidade a maiúsculas e minúsculas, acentos, largura ou kana. Os exemplos a seguir descrevem o comportamento da ordem de classificação para várias combinações de sufixos.
Sufixo de agrupamento do Windows | Descrição da ordem de classificação |
---|---|
_BIN 1 | Classificação binária |
_BIN2 1, 2 | Ordem de classificação de pontos de código binário |
_CI_AI 2 | Insensível a maiúsculas e minúsculas, acentos, kana e largura |
_CI_AI_KS 2 | Insensível a maiúsculas e minúsculas, insensível a acentos, sensível a kana, insensível à largura |
_CI_AI_KS_WS 2 | Insensível a maiúsculas e minúsculas, a acentos, sensível a kana, sensível a largura |
_CI_AI_WS 2 | Insensível a maiúsculas e minúsculas, a acentos, aos caracteres japoneses kana, sensível à largura |
_CI_AS 2 | Insensível a maiúsculas e minúsculas, sensível a acento, insensível a kana, insensível a largura |
_CI_AS_KS 2 | Insensível a maiúsculas e minúsculas, sensível a acentos, kana, insensível à largura |
_CI_AS_KS_WS 2 | Insensível a maiúsculas e minúsculas, sensível a acentos, kana e largura |
_CI_AS_WS 2 | Insensível a maiúsculas e minúsculas, sensível a acentos, insensível a kana, sensível a largura |
_CS_AI 2 | Sensível a maiúsculas e minúsculas, insensível a acentos, kana ou largura |
_CS_AI_KS 2 | Sensível a maiúsculas e minúsculas, insensível a acentos, sensível a kana, insensível a largura |
_CS_AI_KS_WS 2 | Sensível a maiúsculas e minúsculas, insensível a acentos, sensível a kana e largura |
_CS_AI_WS 2 | Sensível a maiúsculas e minúsculas, insensível a acentos, insensível a kana, sensível a largura |
_CS_AS 2 | Sensível a maiúsculas e minúsculas, sensível a acentos, insensível a kana, insensível a largura |
_CS_AS_KS 2 | Sensível a maiúsculas e minúsculas, sensível a acentos, sensível a kana, insensível a largura |
_CS_AS_KS_WS 2 | Sensível a maiúsculas e minúsculas, sensível a acentos, sensível a kana e sensível a largura |
_CS_AS_WS 2 | Sensível a maiúsculas/minúsculas, a acentos, insensível a kana, sensível à largura |
1 Se o ponto de código binário ou binário estiver selecionado, as opções Diferencia maiúsculas de minúsculas (_CS), Acento (_AS), Kana (_KS) e Largura (_WS) não estarão disponíveis.
2 Adicionar a opção UTF-8 (_UTF8) permite codificar dados Unicode usando UTF-8. Para obter mais informações, consulte a seção UTF-8 Support neste artigo.
Conjuntos de agrupamento
O SQL Server dá suporte aos seguintes conjuntos de agrupamento:
Agrupamentos do Windows
Os agrupamentos do Windows definem regras para armazenar dados de caracteres baseados em uma localidade associada do sistema Windows. Para um agrupamento do Windows, você pode implementar uma comparação de dados não-Unicode usando o mesmo algoritmo que para dados Unicode. As regras de agrupamento base do Windows especificam qual alfabeto ou idioma é usado quando a classificação de dicionário é aplicada. As regras também especificam a página de código usada para armazenar dados de caracteres não-Unicode. A classificação Unicode e não-Unicode é compatível com comparações de strings numa versão específica do Windows. Isso fornece consistência entre os tipos de dados no SQL Server e permite que os desenvolvedores classifiquem cadeias de caracteres em seus aplicativos usando as mesmas regras usadas pelo SQL Server. Para obter mais informações, consulte nome de agrupamento do Windows.
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. São sensíveis a maiúsculas e minúsculas. Um agrupamento binário no SQL Server define a localidade e a página de código ANSI que são usadas. Isso impõe uma ordem de classificação binária. Por serem relativamente simples, os agrupamentos binários ajudam a melhorar o desempenho do aplicativo. Para tipos de dados não-Unicode, as comparações de dados são baseadas nos pontos de código definidos na página de código ANSI. Para tipos de dados Unicode, as comparações de dados são baseadas nos 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, Latin1_General_BIN
e Japanese_BIN
produzem resultados de classificação idênticos quando são usados em dados Unicode. Para obter mais informações, consulte nome de agrupamento do Windows.
Há dois tipos de agrupamentos binários no SQL Server:
Os agrupamentos
BIN
herdados, que realizavam uma comparação incompleta de ponto de código para ponto de código para dados Unicode. Os agrupamentos binários herdados compararam o primeiro caractere como WCHAR, seguido por uma comparação byte a byte. 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.Os agrupamentos
BIN2
mais recentes, que implementam uma comparação pura de pontos de código. Em um agrupamento BIN2, todos os caracteres são classificados de acordo com seus pontos de código. Como a plataforma Intel é uma arquitetura um pouco endiana, os caracteres de código Unicode são sempre armazenados com troca de bytes.
Colações do SQL Server
Os agrupamentos do SQL Server (SQL_*) fornecem 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 qualquer rotina de classificação fornecida 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ê vê resultados diferentes para comparações dos mesmos dados, dependendo do tipo de dados subjacente.
Por exemplo, se estiver a usar a collation SQL SQL_Latin1_General_CP1_CI_AS
, a cadeia de caracteres não-Unicode 'a-c'
é menor do que a 'ab'
porque o hífen (-
) é classificado como um caráter separado que vem antes de b
. No entanto, se você converter essas cadeias de caracteres em Unicode e executar a mesma comparação, a
Para obter mais informações, consulte Nome de agrupamento do SQL Server.
Durante a instalação do SQL Server, a configuração de agrupamento de instalação padrão é determinada pela localidade do sistema operacional (SO). Você pode alterar o agrupamento no nível do servidor durante a instalação ou alterando a localidade do sistema operacional antes da instalação. Por motivos de compatibilidade com versões anteriores, o agrupamento padrão é definido como a versão mais antiga disponível associada a cada localidade específica. Portanto, este nem sempre é o agrupamento recomendado. Para aproveitar ao máximo os recursos do SQL Server, altere as configurações de instalação padrão para usar agrupamentos do Windows. Por exemplo, para a localidade do SO "Inglês (Estados Unidos)" (página de código 1252), o agrupamento padrão durante a instalação é SQL_Latin1_General_CP1_CI_AS
e pode ser alterado para sua contraparte de agrupamento do Windows mais próxima, Latin1_General_100_CI_AS_SC
.
Ao atualizar uma instância em inglês do SQL Server, você pode especificar agrupamentos do SQL Server (SQL_*) para compatibilidade com instâncias existentes do SQL Server. Como o agrupamento padrão para uma instância do SQL Server é definido durante a instalação, certifique-se de especificar as configurações de agrupamento cuidadosamente quando as seguintes condições forem verdadeiras:
- O código do aplicativo depende do comportamento de agrupamentos anteriores do SQL Server.
- Você deve armazenar dados de caracteres que reflitam vários idiomas.
Níveis de agrupamento
Há suporte para agrupamentos de configuração nos seguintes níveis de uma instância do SQL Server:
- Collations a nível de servidor
- Agrupamentos no nível de banco de dados
- Agrupamentos em nível de coluna
- Agrupamentos em nível de expressão
Agrupamentos ao nível do servidor
O agrupamento de servidor padrão é determinado durante a instalação do SQL Server e se torna o agrupamento padrão dos bancos de dados do sistema e de todos os bancos de dados de usuários.
A tabela a seguir mostra as designações de agrupamento padrão, conforme determinado pela localidade do sistema operacional (SO), incluindo seus LCID (Identificadores de Código de Linguagem do Windows) e SQL:
Localidade do Windows | Windows LCID | SQL LCID | Ordenação padrão |
---|---|---|---|
Africâner (África do Sul) | 0x0436 | 0x0409 | Latin1_General_CI_AS |
Albanês (Albânia) | 0x041c | 0x041c | Albanian_CI_AS |
Alsaciano (França) | 0x0484 | 0x0409 | Latin1_General_CI_AS |
Amárico (Etiópia) | 0x045e | 0x0409 | Latin1_General_CI_AS |
Árabe (Argélia) | 0x1401 | 0x0401 | Arabic_CI_AS |
Árabe (Bahrein) | 0x3c01 | 0x0401 | Arabic_CI_AS |
Árabe (Egito) | 0x0c01 | 0x0401 | Arabic_CI_AS |
Árabe (Iraque) | 0x0801 | 0x0401 | Arabic_CI_AS |
Árabe (Jordânia) | 0x2c01 | 0x0401 | Arabic_CI_AS |
Árabe (Kuwait) | 0x3401 | 0x0401 | Arabic_CI_AS |
Árabe (Líbano) | 0x3001 | 0x0401 | Arabic_CI_AS |
Árabe (Líbia) | 0x1001 | 0x0401 | Arabic_CI_AS |
Árabe (Marrocos) | 0x1801 | 0x0401 | Arabic_CI_AS |
Árabe (Omã) | 0x2001 | 0x0401 | Arabic_CI_AS |
Árabe (Qatar) | 0x4001 | 0x0401 | Arabic_CI_AS |
Árabe (Arábia Saudita) | 0x0401 | 0x0401 | Arabic_CI_AS |
Árabe (Síria) | 0x2801 | 0x0401 | Arabic_CI_AS |
Árabe (Tunísia) | 0x1c01 | 0x0401 | Arabic_CI_AS |
Árabe (E.U.A.) | 0x3801 | 0x0401 | Arabic_CI_AS |
Árabe (Iémen) | 0x2401 | 0x0401 | Arabic_CI_AS |
Arménio (Arménia) | 0x042b | 0x0419 | Latin1_General_CI_AS |
Assamese (Índia) | 0x044d | 0x044d | Não disponível no nível do servidor |
Azerbaijão (Azerbaijão, cirílico) | 0x082c | 0x082c | Preterido, não disponível no nível do servidor |
Azerbaijão (Azerbaijão, Latim) | 0x042c | 0x042c | Preterido, não disponível no nível do servidor |
Bashkir (Rússia) | 0x046d | 0x046d | Latin1_General_CI_AI |
Basco (Basco) | 0x042d | 0x0409 | Latin1_General_CI_AS |
Bielorrussa (Bielorrússia) | 0x0423 | 0x0419 | Cyrillic_General_CI_AS |
Bangla (Bangladesh) | 0x0845 | 0x0445 | Não disponível no nível do servidor |
Bengali (Índia) | 0x0445 | 0x0439 | Não disponível no nível do servidor |
Bósnio (Bósnia e Herzegovina, cirílico) | 0x201a | 0x201a | Latin1_General_CI_AI |
Bósnio (Bósnia e Herzegovina, latino) | 0x141a | 0x141a | Latin1_General_CI_AI |
Bretão (França) | 0x047e | 0x047e | Latin1_General_CI_AI |
Búlgaro (Bulgária) | 0x0402 | 0x0419 | Cyrillic_General_CI_AS |
Catalão (Catalão) | 0x0403 | 0x0409 | Latin1_General_CI_AS |
Chinês (RAE de Hong Kong, RPC) | 0x0c04 | 0x0404 | Chinese_Taiwan_Stroke_CI_AS |
Chinês (RAE de Macau) | 0x1404 | 0x1404 | Latin1_General_CI_AI |
Chinês (RAE de Macau) | 0x21404 | 0x21404 | Latin1_General_CI_AI |
Chinês (RPC) | 0x0804 | 0x0804 | Chinese_PRC_CI_AS |
Chinês (RPC) | 0x20804 | 0x20804 | Chinese_PRC_Stroke_CI_AS |
Chinês (Singapura) | 0x1004 | 0x0804 | Chinese_PRC_CI_AS |
Chinês (Singapura) | 0x21004 | 0x20804 | Chinese_PRC_Stroke_CI_AS |
Chinês (Taiwan) | 0x30404 | 0x30404 | Chinese_Taiwan_Bopomofo_CI_AS |
Chinês (Taiwan) | 0x0404 | 0x0404 | Chinese_Taiwan_Stroke_CI_AS |
Córsega (França) | 0x0483 | 0x0483 | Latin1_General_CI_AI |
Croata (Bósnia e Herzegovina, latina) | 0x101a | 0x041a | Croatian_CI_AS |
Croata (Croácia) | 0x041a | 0x041a | Croatian_CI_AS |
Checo (República Checa) | 0x0405 | 0x0405 | Czech_CI_AS |
Dinamarquês (Dinamarca) | 0x0406 | 0x0406 | Danish_Norwegian_CI_AS |
Dari (Afeganistão) | 0x048c | 0x048c | Latin1_General_CI_AI |
Divehi (Maldivas) | 0x0465 | 0x0465 | Não disponível no nível do servidor |
Neerlandês (Bélgica) | 0x0813 | 0x0409 | Latin1_General_CI_AS |
Neerlandês (Países Baixos) | 0x0413 | 0x0409 | Latin1_General_CI_AS |
Português (Portugal) | 0x0c09 | 0x0409 | Latin1_General_CI_AS |
Inglês (Belize) | 0x2809 | 0x0409 | Latin1_General_CI_AS |
Inglês (Canadá) | 0x1009 | 0x0409 | Latin1_General_CI_AS |
Inglês (Caribe) | 0x2409 | 0x0409 | Latin1_General_CI_AS |
Inglês (Índia) | 0x4009 | 0x0409 | Latin1_General_CI_AS |
Inglês (Irlanda) | 0x1809 | 0x0409 | Latin1_General_CI_AS |
Inglês (Jamaica) | 0x2009 | 0x0409 | Latin1_General_CI_AS |
Inglês (Malásia) | 0x4409 | 0x0409 | Latin1_General_CI_AS |
Inglês (Nova Zelândia) | 0x1409 | 0x0409 | Latin1_General_CI_AS |
Inglês (Filipinas) | 0x3409 | 0x0409 | Latin1_General_CI_AS |
Inglês (Singapura) | 0x4809 | 0x0409 | Latin1_General_CI_AS |
Inglês (África do Sul) | 0x1c09 | 0x0409 | Latin1_General_CI_AS |
Inglês (Trinidad e Tobago) | 0x2c09 | 0x0409 | Latin1_General_CI_AS |
Inglês (Reino Unido) | 0x0809 | 0x0409 | Latin1_General_CI_AS |
Inglês (Estados Unidos) | 0x0409 | 0x0409 | SQL_Latin1_General_CP1_CI_AS |
Inglês (Zimbabué) | 0x3009 | 0x0409 | Latin1_General_CI_AS |
Estónio (Estónia) | 0x0425 | 0x0425 | Estonian_CI_AS |
Faroé (Ilhas Faroé) | 0x0438 | 0x0409 | Latin1_General_CI_AS |
Filipino (Filipinas) | 0x0464 | 0x0409 | Latin1_General_CI_AS |
Finlandês (Finlândia) | 0x040b | 0x040b | Finnish_Swedish_CI_AS |
Francês (Bélgica) | 0x080c | 0x040c | French_CI_AS |
Francês (Canadá) | 0x0c0c | 0x040c | French_CI_AS |
Francês (França) | 0x040c | 0x040c | French_CI_AS |
Francês (Luxemburgo) | 0x140c | 0x040c | French_CI_AS |
Francês (Mónaco) | 0x180c | 0x040c | French_CI_AS |
Francês (Suíça) | 0x100c | 0x040c | French_CI_AS |
Frísio (Países Baixos) | 0x0462 | 0x0462 | Latin1_General_CI_AI |
Galego | 0x0456 | 0x0409 | Latin1_General_CI_AS |
Georgiano (Geórgia) | 0x10437 | 0x10437 | Georgian_Modern_Sort_CI_AS |
Georgiano (Geórgia) | 0x0437 | 0x0419 | Latin1_General_CI_AS |
Alemão - Ordenação de Lista Telefónica (DIN) | 0x10407 | 0x10407 | German_PhoneBook_CI_AS |
Alemão (Áustria) | 0x0c07 | 0x0409 | Latin1_General_CI_AS |
Alemão (Alemanha) | 0x0407 | 0x0409 | Latin1_General_CI_AS |
Alemão (Liechtenstein) | 0x1407 | 0x0409 | Latin1_General_CI_AS |
Alemão (Luxemburgo) | 0x1007 | 0x0409 | Latin1_General_CI_AS |
Alemão (Suíça) | 0x0807 | 0x0409 | Latin1_General_CI_AS |
Grego (Grécia) | 0x0408 | 0x0408 | Greek_CI_AS |
Groenlandês (Gronelândia) | 0x046f | 0x0406 | Danish_Norwegian_CI_AS |
Gujarati (Índia) | 0x0447 | 0x0439 | Não disponível no nível do servidor |
Hausa (Nigéria, Latim) | 0x0468 | 0x0409 | Latin1_General_CI_AS |
Hebraico (Israel) | 0x040d | 0x040d | Hebrew_CI_AS |
Hindi (Índia) | 0x0439 | 0x0439 | Não disponível no nível do servidor |
Húngaro (Hungria) | 0x040e | 0x040e | Hungarian_CI_AS |
Classificação técnica húngara | 0x1040e | 0x1040e | Hungarian_Technical_CI_AS |
Islandês (Islândia) | 0x040f | 0x040f | Icelandic_CI_AS |
Igbo (Nigéria) | 0x0470 | 0x0409 | Latin1_General_CI_AS |
Indonésio (Indonésia) | 0x0421 | 0x0409 | Latin1_General_CI_AS |
Inuktitut (Canadá, Latino) | 0x085d | 0x0409 | Latin1_General_CI_AS |
Inuktitut (Syllabics) Canadá | 0x045d | 0x045d | Latin1_General_CI_AI |
Irlandês (Irlanda) | 0x083c | 0x0409 | Latin1_General_CI_AS |
Italiano (Itália) | 0x0410 | 0x0409 | Latin1_General_CI_AS |
Italiano (Suíça) | 0x0810 | 0x0409 | Latin1_General_CI_AS |
Japonês (Japão XJIS) | 0x0411 | 0x0411 | Japanese_CI_AS |
Japonês (Japão) | 0x040411 | 0x40411 | Latin1_General_CI_AI |
Kannada (Índia) | 0x044b | 0x0439 | Não disponível no nível do servidor |
Cazaque (Cazaquistão) | 0x043f | 0x043f | Kazakh_90_CI_AS |
Khmer (Camboja) | 0x0453 | 0x0453 | Não disponível no nível do servidor |
K'iche (Guatemala) | 0x0486 | 0x0c0a | Modern_Spanish_CI_AS |
Kinyarwanda (Ruanda) | 0x0487 | 0x0409 | Latin1_General_CI_AS |
Konkani (Índia) | 0x0457 | 0x0439 | Não disponível no nível do servidor |
Coreano (Ordenação de Dicionário da Coreia) | 0x0412 | 0x0412 | Korean_Wansung_CI_AS |
Quirguistão (Quirguistão) | 0x0440 | 0x0419 | Cyrillic_General_CI_AS |
Laos (RDP do Laos) | 0x0454 | 0x0454 | Não disponível no nível do servidor |
Letão (Letónia) | 0x0426 | 0x0426 | Latvian_CI_AS |
Lituano (Lituânia) | 0x0427 | 0x0427 | Lithuanian_CI_AS |
Baixo Sorbiano (Alemanha) | 0x082e | 0x0409 | Latin1_General_CI_AS |
Luxemburguês (Luxemburgo) | 0x046e | 0x0409 | Latin1_General_CI_AS |
Macedónio (Macedónia do Norte) | 0x042f | 0x042f | Macedonian_FYROM_90_CI_AS |
Malaio (Brunei Darussalam) | 0x083e | 0x0409 | Latin1_General_CI_AS |
Malaio (Malásia) | 0x043e | 0x0409 | Latin1_General_CI_AS |
Malaiala (Índia) | 0x044c | 0x0439 | Não disponível no nível do servidor |
Maltês (Malta) | 0x043a | 0x043a | Latin1_General_CI_AI |
Maori (Nova Zelândia) | 0x0481 | 0x0481 | Latin1_General_CI_AI |
Mapudungun (Chile) | 0x047a | 0x047a | Latin1_General_CI_AI |
Marathi (Índia) | 0x044e | 0x0439 | Não disponível no nível do servidor |
Mohawk (Canadá) | 0x047c | 0x047c | Latin1_General_CI_AI |
Mongol (Mongólia) | 0x0450 | 0x0419 | Cyrillic_General_CI_AS |
Mongoliano (RPC) | 0x0850 | 0x0419 | Cyrillic_General_CI_AS |
Nepalês (Nepal) | 0x0461 | 0x0461 | Não disponível no nível do servidor |
Norueguês (Bokmål, Noruega) | 0x0414 | 0x0414 | Latin1_General_CI_AI |
Norueguês (Nynorsk, Noruega) | 0x0814 | 0x0414 | Latin1_General_CI_AI |
Occitano (França) | 0x0482 | 0x040c | French_CI_AS |
Odia (Índia) | 0x0448 | 0x0439 | Não disponível no nível do servidor |
Pashto (Afeganistão) | 0x0463 | 0x0463 | Não disponível no nível do servidor |
Persa (Irão) | 0x0429 | 0x0429 | Latin1_General_CI_AI |
Polaco (Polónia) | 0x0415 | 0x0415 | Polish_CI_AS |
Português (Brasil) | 0x0416 | 0x0409 | Latin1_General_CI_AS |
Português (Portugal) | 0x0816 | 0x0409 | Latin1_General_CI_AS |
Punjabi (Índia) | 0x0446 | 0x0439 | Não disponível no nível do servidor |
Quéchua (Bolívia) | 0x046b | 0x0409 | Latin1_General_CI_AS |
Quéchua (Equador) | 0x086b | 0x0409 | Latin1_General_CI_AS |
Quéchua (Peru) | 0x0c6b | 0x0409 | Latin1_General_CI_AS |
Romeno (Roménia) | 0x0418 | 0x0418 | Romanian_CI_AS |
Romanche (Suíça) | 0x0417 | 0x0417 | Latin1_General_CI_AI |
Russo (Rússia) | 0x0419 | 0x0419 | Cyrillic_General_CI_AS |
Sahka (Rússia) | 0x0485 | 0x0485 | Latin1_General_CI_AI |
Sami (Inari, Finlândia) | 0x243b | 0x083b | Latin1_General_CI_AI |
Sami (Lule, Noruega) | 0x103b | 0x043b | Latin1_General_CI_AI |
Sami (Lule, Suécia) | 0x143b | 0x083b | Latin1_General_CI_AI |
Sami (Norte, Finlândia) | 0x0c3b | 0x083b | Latin1_General_CI_AI |
Sami (Norte, Noruega) | 0x043b | 0x043b | Latin1_General_CI_AI |
Sami (Norte, Suécia) | 0x083b | 0x083b | Latin1_General_CI_AI |
Sami (Skolt, Finlândia) | 0x203b | 0x083b | Latin1_General_CI_AI |
Sami (Sul, Noruega) | 0x183b | 0x043b | Latin1_General_CI_AI |
Sami (Sul, Suécia) | 0x1c3b | 0x083b | Latin1_General_CI_AI |
Sânscrito (Índia) | 0x044f | 0x0439 | Não disponível no nível do servidor |
Sérvio (Bósnia e Herzegovina, cirílico) | 0x1c1a | 0x0c1a | Latin1_General_CI_AI |
Sérvio (Bósnia e Herzegovina, latino) | 0x181a | 0x081a | Latin1_General_CI_AI |
Sérvio (Sérvia, cirílico) | 0x0c1a | 0x0c1a | Latin1_General_CI_AI |
Sérvio (Sérvia, alfabeto latino) | 0x081a | 0x081a | Latin1_General_CI_AI |
Sesotho sa Leboa/Northern Sotho (África do Sul) | 0x046c | 0x0409 | Latin1_General_CI_AS |
Setswana/Tswana (África do Sul) | 0x0432 | 0x0409 | Latin1_General_CI_AS |
Cingalês (Sri Lanka) | 0x045b | 0x0439 | Não disponível no nível do servidor |
Eslovaco (Eslováquia) | 0x041b | 0x041b | Slovak_CI_AS |
Esloveno (Eslovénia) | 0x0424 | 0x0424 | Slovenian_CI_AS |
Espanhol (Argentina) | 0x2c0a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Bolívia) | 0x400a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Chile) | 0x340a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Colômbia) | 0x240a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Costa Rica) | 0x140a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (República Dominicana) | 0x1c0a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Equador) | 0x300a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (El Salvador) | 0x440a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Guatemala) | 0x100a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Honduras) | 0x480a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (México) | 0x080a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Nicarágua) | 0x4c0a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Panamá) | 0x180a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Paraguai) | 0x3c0a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Peru) | 0x280a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Porto Rico) | 0x500a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Espanha) | 0x0c0a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Espanha, Classificação Tradicional) | 0x040a | 0x040a | Traditional_Spanish_CI_AS |
Espanhol (Estados Unidos) | 0x540a | 0x0409 | Latin1_General_CI_AS |
Espanhol (Uruguai) | 0x380a | 0x0c0a | Modern_Spanish_CI_AS |
Espanhol (Venezuela) | 0x200a | 0x0c0a | Modern_Spanish_CI_AS |
Swahili (Quênia) | 0x0441 | 0x0409 | Latin1_General_CI_AS |
Sueco (Finlândia) | 0x081d | 0x040b | Finnish_Swedish_CI_AS |
Sueco (Suécia) | 0x041d | 0x040b | Finnish_Swedish_CI_AS |
Siríaco (Síria) | 0x045a | 0x045a | Não disponível no nível do servidor |
Tajiquistão (Tajiquistão) | 0x0428 | 0x0419 | Cyrillic_General_CI_AS |
Tamazight (Argélia, Latin) | 0x085f | 0x085f | Latin1_General_CI_AI |
Tâmil (Índia) | 0x0449 | 0x0439 | Não disponível no nível do servidor |
Tártaro (Rússia) | 0x0444 | 0x0444 | Cyrillic_General_CI_AS |
Telugu (Índia) | 0x044a | 0x0439 | Não disponível no nível do servidor |
Tailandês (Tailândia) | 0x041e | 0x041e | Thai_CI_AS |
Tibetano (RPC) | 0x0451 | 0x0451 | Não disponível no nível do servidor |
Turco (Turquia) | 0x041f | 0x041f | Turkish_CI_AS |
Turcomeno (Turquemenistão) | 0x0442 | 0x0442 | Latin1_General_CI_AI |
Uigur (RPC) | 0x0480 | 0x0480 | Latin1_General_CI_AI |
Ucraniano (Ucrânia) | 0x0422 | 0x0422 | Ukrainian_CI_AS |
Alto Sorbian (Alemanha) | 0x042e | 0x042e | Latin1_General_CI_AI |
Urdu (Paquistão) | 0x0420 | 0x0420 | Latin1_General_CI_AI |
Uzbeque (Uzbequistão, cirílico) | 0x0843 | 0x0419 | Cyrillic_General_CI_AS |
Uzbeque (Uzbequistão, latim) | 0x0443 | 0x0443 | Uzbek_Latin_90_CI_AS |
Vietnamita (Vietname) | 0x042a | 0x042a | Vietnamese_CI_AS |
Galês (Reino Unido) | 0x0452 | 0x0452 | Latin1_General_CI_AI |
Wolof (Senegal) | 0x0488 | 0x040c | French_CI_AS |
Xhosa/isiXhosa (África do Sul) | 0x0434 | 0x0409 | Latin1_General_CI_AS |
Yi (RPC) | 0x0478 | 0x0409 | Latin1_General_CI_AS |
Yoruba (Nigéria) | 0x046a | 0x0409 | Latin1_General_CI_AS |
Zulu/isiZulu (África do Sul) | 0x0435 | 0x0409 | Latin1_General_CI_AS |
Depois de atribuir um agrupamento ao servidor, você pode alterá-lo somente exportando todos os objetos e dados do banco de dados, reconstruindo o banco de dados master
e importando todos os objetos e dados do banco de dados. Em vez de alterar o agrupamento padrão de uma instância do SQL Server, você pode especificar o agrupamento desejado ao criar um novo banco de dados ou coluna de banco de dados.
Para consultar o agrupamento de servidores para uma instância do SQL Server, use a função SERVERPROPERTY
:
SELECT CONVERT (NVARCHAR (128), SERVERPROPERTY('collation'));
Para consultar o servidor sobre todos os agrupamentos disponíveis, use a seguinte função interna fn_helpcollations()
:
SELECT *
FROM sys.fn_helpcollations();
Agrupamentos no Banco de Dados SQL do Azure
Você não pode alterar ou definir o agrupamento de servidor lógico no Banco de Dados SQL do Azure, mas pode configurar os agrupamentos de cada banco de dados para dados e para o catálogo. O agrupamento de catálogo determina o agrupamento de metadados do sistema, como identificadores de objeto. Ambos os agrupamentos podem ser especificados independentemente quando você criar o banco de dados no portal do Azure, em T-SQL com CREATE DATABASE, no PowerShell com New-AzSqlDatabase.
Colações na Instância Gerida SQL do Azure
O agrupamento no nível do servidor na Instância Gerenciada SQL do Azure pode ser especificado quando a instância é criada e não pode ser alterado posteriormente.
Para obter mais informações, consulte Definir ou alterar o agrupamento do servidor.
Agrupamentos no nível de banco de dados
Ao criar ou modificar um banco de dados, 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, a base de dados será atribuída ao agrupamento do servidor.
Não é possível alterar o agrupamento de bancos de dados do sistema, a menos que você altere o agrupamento para o servidor.
- No SQL Server e na Instância Gerenciada SQL do Azure, o agrupamento de banco de dados é usado para todos os metadados no banco de dados e o agrupamento é o padrão para todas as colunas de cadeia de caracteres, objetos temporários, nomes de variáveis e quaisquer outras cadeias de caracteres usadas no banco de dados.
- No Banco de Dados SQL do Azure, não há agrupamento de servidor, portanto, cada banco de dados tem um agrupamento para dados e um agrupamento para o catálogo. O CATALOG_COLLATION é usado para todos os metadados no banco de dados e o agrupamento é o padrão para todas as colunas de cadeia de caracteres, objetos temporários, nomes de variáveis e quaisquer outras cadeias de caracteres usadas no banco de dados. O CATALOG_COLLATION é definido no momento da criação e não pode ser alterado.
Quando você altera o agrupamento de um banco de dados de usuário, pode haver conflitos de agrupamento quando consultas no banco de dados acessam tabelas temporárias. As tabelas temporárias são sempre armazenadas no banco de dados do sistema tempdb
, que usa o agrupamento para a instância. As consultas que comparam dados de caracteres entre o banco de dados do usuário e o tempdb
podem falhar se os agrupamentos causarem um conflito na avaliação dos dados de caracteres. Você pode resolver esse problema especificando a cláusula COLLATE
na consulta. Para obter mais informações, consulte COLLATE.
Você pode alterar o agrupamento de um banco de dados de usuário usando uma instrução ALTER DATABASE
semelhante ao exemplo de código a seguir:
ALTER DATABASE myDB COLLATE Greek_CS_AI;
Importante
Alterar o agrupamento no nível do banco de dados não afeta os agrupamentos no nível da coluna ou no nível da expressão. Não afeta os dados nas colunas existentes.
Você pode recuperar o agrupamento atual de um banco de dados usando uma instrução semelhante ao exemplo de código a seguir:
SELECT CONVERT (NVARCHAR (128), DATABASEPROPERTYEX('database_name', 'collation'));
Agrupamentos em nível de coluna
Ao criar ou alterar uma tabela, você pode especificar agrupamentos para cada coluna de cadeia de caracteres usando a cláusula COLLATE
. Se você não especificar um agrupamento, será atribuído à coluna o agrupamento padrão do banco de dados.
Você pode alterar o agrupamento de uma coluna usando uma instrução ALTER TABLE
semelhante ao exemplo de código a seguir:
ALTER TABLE myTable ALTER COLUMN mycol NVARCHAR (10) COLLATE Greek_CS_AI;
Colações ao nível da expressão
Os agrupamentos no nível da expressão são definidos quando uma instrução é executada e afetam a maneira como um conjunto de resultados é retornado. Isso permite que os resultados de classificação de ORDER BY
sejam específicos da localidade. Para implementar agrupamentos no nível da expressão, use uma cláusula COLLATE
, como o exemplo de código a seguir:
SELECT name
FROM customer
ORDER BY name COLLATE Latin1_General_CS_AI;
Localidade
Uma localidade é um conjunto de informações associadas a um local ou a uma cultura. As informações podem incluir o nome e o identificador da língua falada, o script usado para escrever a língua e as convenções culturais. Os agrupamentos podem ser associados a uma ou mais localizações. Para obter mais informações, consulte Identificadores de Localidade atribuídos pela Microsoft.
Página de código
Uma página de código é um conjunto ordenado de caracteres 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ódigo do Windows é normalmente referida como um conjunto de caracteres ou um conjunto de caracteres . As páginas de código são usadas para fornecer suporte para os conjuntos de caracteres e layouts de teclado que são usados por diferentes localidades do sistema Windows.
Ordem de classificação
A ordem de classificação especifica como os valores de dados são classificados. A ordem afeta os resultados da comparação de dados. Os dados são classificados usando agrupamentos e podem ser otimizados usando índices.
Suporte a Unicode
Unicode é um padrão para mapear pontos de código para caracteres. Como ele foi projetado para cobrir todos os caracteres de todos os idiomas do mundo, você não precisa de páginas de código diferentes para lidar com diferentes conjuntos de caracteres.
Noções básicas de Unicode
O armazenamento de dados em vários idiomas em um banco de dados é difícil de gerenciar quando você usa apenas dados de caracteres e páginas de código. Também é difícil encontrar uma página de código para o banco de dados que possa armazenar todos os caracteres específicos do idioma necessários. Além disso, é difícil garantir a tradução correta de caracteres especiais quando eles estão sendo lidos ou atualizados por uma variedade de clientes que estão executando várias páginas de código. Os bancos de dados que oferecem suporte a clientes internacionais devem sempre usar tipos de dados Unicode em vez de tipos de dados não-Unicode.
Por exemplo, considere um banco de dados de clientes na América do Norte que deve lidar com três idiomas principais:
- Nomes e endereços em espanhol para México
- Nomes e endereços franceses para Quebec
- Nomes e endereços em inglês para o resto do Canadá e dos Estados Unidos
Ao usar apenas colunas de caracteres e páginas de código, você deve tomar cuidado para garantir que o banco de dados seja instalado com uma página de código que manipulará os caracteres dos três idiomas. Você também deve ter o cuidado de garantir a tradução correta de caracteres de qualquer um dos idiomas quando os caracteres são lidos por clientes que estão executando uma página de código para outro idioma.
Observação
As páginas de código que um cliente usa são determinadas pelas configurações do sistema operacional (SO). Para definir páginas de código de cliente no sistema operacional Windows, use Configurações Regionais no Painel de Controle.
Seria difícil selecionar uma página de código para tipos de dados de caracteres que suportassem todos os caracteres exigidos por um público mundial. A maneira mais fácil de gerenciar dados de caracteres em bancos de dados internacionais é sempre usar um tipo de dados que ofereça suporte a Unicode.
Tipos de dados Unicode
Se você armazenar dados de caracteres que reflitam vários idiomas no SQL Server (SQL Server 2005 (9.x) e posterior), use tipos de dados Unicode (nchar, nvarchare ntext) em vez de tipos de dados não-Unicode (char, varchare texto).
Observação
Para tipos de dados Unicode, a Engine de Base de Dados pode representar até 65.536 caracteres utilizando UCS-2, ou a gama completa do Unicode (1.114.112 caracteres) se forem utilizados caracteres suplementares. Para obter mais informações sobre como habilitar caracteres suplementares, consulte Supplementary Characters.
Como alternativa, a partir do SQL Server 2019 (15.x), se um agrupamento habilitado para UTF-8 (_UTF8) for usado, tipos de dados anteriormente não Unicode (char e varchar) se tornarão tipos de dados Unicode usando codificação UTF-8. O SQL Server 2019 (15.x) não altera o comportamento de tipos de dados Unicode existentes anteriormente (nchar, nvarchare ntext), que continuam a usar codificação UCS-2 ou UTF-16. Para obter mais informações, consulte Diferenças de armazenamento entre UTF-8 e UTF-16.
Considerações sobre Unicode
Limitações significativas estão associadas a tipos de dados não-Unicode. Isso ocorre porque um computador não-Unicode está limitado a usar uma única página de código. Você pode experimentar ganho de desempenho usando Unicode, porque requer menos conversões de página de código. Os agrupamentos Unicode devem ser selecionados individualmente no nível do banco de dados, coluna ou expressão, pois não são suportados no nível do servidor.
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. Sua melhor opção pode ser atualizar o sistema operacional cliente para que os agrupamentos do sistema subjacente sejam atualizados. Se o cliente tiver software cliente de banco de dados instalado, você pode considerar a aplicação de uma atualização de serviço ao software cliente de banco de dados.
Dica
Você também pode tentar usar um agrupamento diferente para os dados no servidor. Escolha um agrupamento que mapeie para uma página de código no cliente. Para usar os agrupamentos UTF-16 disponíveis no SQL Server (SQL Server 2012 (11.x) e posterior) para melhorar a pesquisa e a classificação de alguns caracteres Unicode (somente agrupamentos do Windows), você pode selecionar um dos agrupamentos de caracteres suplementares (_SC) ou um dos agrupamentos da versão 140.
Para usar os agrupamentos UTF-8 disponíveis no SQL Server 2019 (15.x) e para melhorar a pesquisa e a classificação de alguns caracteres Unicode (somente agrupamentos do Windows), você deve selecionar agrupamentos habilitados para codificação UTF-8 (_UTF8).
O sinalizador UTF8 pode ser aplicado a:
- Colações linguísticas que já suportam caracteres suplementares (_SC) ou estão adaptadas a seletores de variação (_VSS)
- Agrupamento binário BIN2
O sinalizador UTF8 não pode ser aplicado a:
- Ordenações linguísticas que não suportam caracteres suplementares (_SC) ou sensibilidade ao seletor de variação (_VSS)
- Os agrupamentos binários BIN
- Os agrupamentos SQL_*
Para avaliar 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 em sistemas em toda a organização e implantar servidores e clientes Unicode sempre que possível.
Em muitas situações, o SQL Server interage com outros servidores ou clientes, e sua organização pode usar vários padrões de acesso a dados entre aplicativos e instâncias de servidor. Os clientes do SQL Server são um dos dois tipos principais:
- clientes Unicode que usam OLE DB e ODBC (Conectividade de Base de Dados Aberta) versão 3.7 ou mais recente.
- 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 são usados em todo o sistema, esse cenário oferece o melhor desempenho e proteção contra corrupção de dados recuperados. Esta é a situação com ActiveX Data Objects (ADO), OLE DB e ODBC versão 3.7 ou posterior. |
Unicode | Fora do padrão Unicode | Nesse cenário, especialmente com conexões entre um servidor que está executando um sistema operacional mais recente e um cliente que está executando uma versão anterior do SQL Server, ou em um sistema operacional mais antigo, pode haver limitações ou erros quando você move dados para um computador cliente. Os dados Unicode no servidor tentam corresponder a uma página de código equivalente num cliente que não utiliza Unicode, para converter os dados. |
Fora do padrã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 são enviados para servidores que estão fora da página de código do servidor. |
Fora do padrão Unicode | Fora do padrão Unicode | Este é um cenário muito limitativo para dados multilingues. Você pode usar apenas uma única página de código. |
Caracteres suplementares
O Unicode Consortium aloca a cada caractere um ponto de código exclusivo, que é um valor no intervalo 000000 - 10FFFF. Os caracteres usados com mais freqüência têm valores de ponto de código no intervalo 000000 - 00FFFF (65.536 caracteres) que se encaixam em uma palavra de 8 bits ou 16 bits na memória e no disco. Este intervalo é geralmente designado como Plano Multilingue Básico (BMP).
Mas o Unicode Consortium estabeleceu 16 "planos" adicionais de caracteres, cada um do mesmo tamanho que o BMP. Esta definição permite que o Unicode tenha o potencial de representar 1.114.112 caracteres (ou seja, 216 * 17 caracteres) dentro do intervalo de pontos de código 000000 - 10FFFF. Caracteres com valor de ponto de código maior que 00FFFF requerem duas a quatro palavras consecutivas de 8 bits (UTF-8) ou duas palavras consecutivas de 16 bits (UTF-16). Esses caracteres localizados além do BMP são chamados caracteres suplementares, e as palavras adicionais consecutivas de 8 bits ou 16 bits são chamadas de pares substitutos . Para obter mais informações sobre caracteres suplementares, substitutos e pares substitutos, consulte o Unicode Standard.
O SQL Server fornece tipos de dados como nchar e nvarchar para armazenar dados Unicode no intervalo BMP (000000 - 00FFFF), que o Mecanismo de Banco de Dados codifica usando UCS-2.
O SQL Server 2012 (11.x) introduziu uma nova família de agrupamentos de caracteres suplementares (_SC) que podem ser usados com os nchar, nvarchare sql_variant tipos de dados para representar o intervalo de caracteres Unicode completo (000000 - 10FFFF). Por exemplo: Latin1_General_100_CI_AS_SC
ou, se você estiver usando um agrupamento japonês, Japanese_Bushu_Kakusu_100_CI_AS_SC
.
O SQL Server 2019 (15.x) estende o suporte suplementar a caracteres para os tipos de dados char e varchar com os novos agrupamentos habilitados para UTF-8 (_UTF8). Esses tipos de dados também são capazes de representar o intervalo completo de caracteres Unicode.
Observação
A partir do SQL Server 2017 (14.x), todos os novos agrupamentos oferecem suporte automaticamente a caracteres suplementares.
Ao utilizar caracteres suplementares:
Caracteres suplementares podem ser usados em operações de ordenação e comparação em versões de agrupamento 90 ou superiores.
Todos os agrupamentos da versão 100 suportam classificação linguística com caracteres suplementares.
Não há suporte para caracteres suplementares para uso em metadados, como nomes de objetos de banco de dados.
A bandeira SC pode ser aplicada a:
- Colações da versão 90
- Agrupamentos da versão 100
O sinalizador SC não pode ser aplicado a:
- Agrupamentos do Windows sem versão da versão 80
- As agregações binárias BIN ou BIN2
- As colações SQL*
- Agrupamentos da versão 140 (estes não precisam da bandeira SC, porque já suportam caracteres suplementares)
A tabela a seguir compara o comportamento de algumas funções de cadeia de caracteres e operadores de cadeia de caracteres quando eles usam caracteres suplementares com e sem um agrupamento com reconhecimento de caracteres suplementares (SCA):
Função ou operador de cadeia de caracteres | Com uma colagem SCA | Sem um agrupamento SCA |
---|---|---|
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. |
ESQUERDA SUBSTITUIR REVERSO DIREITO SUBSTRING COISAS |
Essas funções tratam cada par substituto como um único ponto de código e funcionam conforme o esperado. | Essas funções podem dividir quaisquer pares substitutos e levar a resultados inesperados. |
NCHAR | Retorna o caractere que corresponde ao valor de ponto de código Unicode especificado no intervalo 0 - 0x10FFFF. Se o valor especificado estiver no intervalo 0 - 0xFFFF, um caractere será retornado. Para valores mais altos, o substituto correspondente é retornado. | Um valor superior a 0xFFFF retorna NULL em vez do substituto correspondente. |
UNICODE | Retorna um ponto de código UTF-16 no intervalo 0 - 0x10FFFF. | Retorna um ponto de código UCS-2 no intervalo 0 - 0xFFFF. |
Combinação coringa de um caractere Curinga - Caractere(s) que não correspondem a |
Caracteres suplementares são suportados para todas as operações curinga. | Não há suporte para caracteres suplementares para essas operações curinga. Outros operadores curinga são suportados. |
Suporte GB18030
GB18030 é um padrão separado que é usado na República Popular da China para codificar caracteres chineses. No GB18030, os caracteres podem ter 1, 2 ou 4 bytes de comprimento. O SQL Server fornece suporte para caracteres codificados em GB18030, reconhecendo-os quando entram no servidor a partir de um aplicativo do lado do cliente e convertendo-os e armazenando-os nativamente como caracteres Unicode. Depois de armazenados no servidor, eles são tratados como caracteres Unicode em quaisquer operações subsequentes.
Você pode usar qualquer ordenação chinesa, de preferência a versão 100 mais recente. Todas as classificações da versão 100 suportam classificação linguística com caracteres GB18030. Se os dados incluírem caracteres suplementares (pares substitutos), você poderá usar os agrupamentos SC disponíveis no SQL Server para melhorar a pesquisa e a classificação.
Observação
Certifique-se de que suas ferramentas de cliente, como o SQL Server Management Studio, usem a fonte Dengxian para exibir corretamente cadeias de caracteres que contenham caracteres codificados em GB18030.
Suporte a scripts complexos
O SQL Server pode dar suporte à entrada, armazenamento, alteração e exibição de scripts complexos. Os scripts complexos incluem os seguintes tipos:
- Scripts que incluem a 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 mudam de forma dependendo de sua posição, ou quando combinados com outros caracteres, como caracteres árabes, índicos e tailandeses.
- Línguas, como o tailandês, que exigem dicionários internos para reconhecer palavras porque não há intervalos entre elas.
Os aplicativos de banco de dados que interagem com o SQL Server devem usar controles que ofereçam suporte a scripts complexos. Os controles de formulário padrão do Windows criados em código gerenciado são habilitados para scripts complexos.
Agrupamentos japoneses adicionados no SQL Server 2017
A partir do SQL Server 2017 (14.x), há suporte para novas famílias de agrupamento japonesas, com as permutações de várias opções (_CS
, _AS
, _KS
, _WS
e _VSS
), bem como _BIN
e _BIN2
.
Para listar esses agrupamentos, você pode consultar o Mecanismo de Banco de Dados do SQL Server:
SELECT name,
description
FROM sys.fn_helpcollations()
WHERE COLLATIONPROPERTY(name, 'Version') = 3;
Todas as novas ordenações têm suporte interno para caracteres suplementares, portanto, nenhuma das novas ordenações de 140
tem (ou precisa) da marca SC.
Esses agrupamentos são suportados em índices do Mecanismo de Banco de Dados, tabelas com otimização de memória, índices columnstore e módulos compilados nativamente.
Suporte UTF-8
O SQL Server 2019 (15.x) apresenta suporte total para a codificação de caracteres UTF-8 amplamente usada como uma codificação de importação ou exportação e como agrupamento em nível de banco de dados ou de coluna para dados de cadeia de caracteres. UTF-8 é permitido nos tipos de dados char e varchar Latin1_General_100_CI_AS_SC
para Latin1_General_100_CI_AS_SC_UTF8
.
UTF-8 está disponível apenas para agrupamentos do Windows que oferecem suporte a caracteres suplementares, conforme introduzido no SQL Server 2012 (11.x). Os tipos de dados nchar e nvarchar permitem apenas a codificação UCS-2 ou UTF-16 e permanecem inalterados.
O Banco de Dados SQL do Azure e a Instância Gerenciada SQL do Azure também oferecem suporte a UTF-8 no nível de banco de dados e coluna, enquanto a Instância Gerenciada SQL também oferece suporte a isso em nível de servidor.
Diferenças de armazenamento entre UTF-8 e UTF-16
O Unicode Consortium aloca a cada caractere um ponto de código exclusivo, que é um valor no intervalo 000000 - 10FFFF. Com o SQL Server 2019 (15.x), as codificações UTF-8 e UTF-16 estão disponíveis para representar o intervalo completo:
- Com a codificação UTF-8, os caracteres no intervalo ASCII (000000 - 00007F) requerem 1 byte, os pontos de código 000080 - 0007FF requerem 2 bytes, os pontos de código 000800 - 00FFFF requerem 3 bytes e os pontos de código 0010000 - 0010FFFF requerem 4 bytes.
- Com a codificação UTF-16, os pontos de código 000000 - 00FFFF requerem 2 bytes e os pontos de código 0010000 - 0010FFFF requerem 4 bytes.
A tabela a seguir lista os bytes de armazenamento de codificação para cada intervalo de caracteres e tipo de codificação:
Intervalo de códigos (hexadecimal) | Intervalo de códigos (decimal) | Bytes de armazenamento 1 com UTF-8 | Bytes de armazenamento 1 com UTF-16 |
---|---|---|---|
000000 - 00007F | 0 - 127 | 1 | 2 |
000080 - 00009F 0000A0 - 0003FF 000400 - 0007FF |
128 - 159 160 - 1,023 1,024 - 2,047 |
2 | 2 |
000800 - 003FFF 004000 - 00FFFF |
2,048 - 16,383 16,384 - 65,535 |
3 | 2 |
010000 - 03FFFF 2 040000 - 10FFFF 2 |
65.536 - 262.143 2 262.144 - 1.114.111 2 |
4 | 4 |
1bytes de armazenamento referem-se ao comprimento codificado em bytes, não ao tamanho de armazenamento em disco do tipo de dados. Para obter mais informações sobre tamanhos de armazenamento em disco, consulte nchar e nvarchar e char e varchar.
2 O intervalo de pontos de código para caracteres suplementares.
Dica
É uma perceção comum, em char e varchar ou em nchar e nvarchar, que n define o número de caracteres. Isso ocorre porque, no exemplo de uma coluna de char(10)
Escolher a codificação Unicode apropriada e o tipo de dados pode proporcionar economias significativas de armazenamento ou aumentar sua pegada de armazenamento atual, dependendo do conjunto de caracteres em uso. Por exemplo, quando você usa um agrupamento latino habilitado para UTF-8, como
Antes de decidir se deseja usar a codificação UTF-8 ou UTF-16 para um banco de dados ou coluna, considere a distribuição de dados de cadeia de caracteres que serão armazenados:
- Se estiver principalmente no intervalo ASCII de 0 a 127 (como o inglês), cada caractere requer 1 byte com UTF-8 e 2 bytes com UTF-16. O uso do UTF-8 oferece benefícios de armazenamento. Alterar um tipo de dados de coluna existente com caracteres ASCII no intervalo de 0 a 127 de nchar(10) para char(10)e usar um agrupamento habilitado para UTF-8 se traduz em uma redução de 50% nos requisitos de armazenamento. Essa redução ocorre porque nchar(10) requer 20 bytes para armazenamento, em comparação com char(10), que requer 10 bytes para a mesma representação de cadeia de caracteres Unicode.
- Acima do intervalo ASCII, quase todos os scripts baseados em latim e grego, cirílico, copta, armênio, hebraico, árabe, siríaco, Tāna e N'Ko exigem 2 bytes por caractere em UTF-8 e UTF-16. Nesses casos, não há diferenças significativas de armazenamento para tipos de dados comparáveis (por exemplo, entre o uso de char ou nchar).
- Se for principalmente script do Leste Asiático (como coreano, chinês e japonês), cada caractere requer 3 bytes com UTF-8 e 2 bytes com UTF-16. O uso do UTF-16 oferece benefícios de armazenamento.
- Os caracteres no intervalo 010000 - 10FFFF requerem 4 bytes em UTF-8 e UTF-16. Nesses casos, não há diferenças de armazenamento para tipos de dados comparáveis (por exemplo, entre usar char ou nchar).
Para outras considerações, consulte Write International Transact-SQL Statements.
Converter para UTF-8
Como char e varchar ou em nchar e nvarchar, o n define o tamanho de armazenamento de bytes, não o número de caracteres que podem ser armazenados, é importante determinar o tamanho do tipo de dados para o qual você deve converter. Os caracteres que excederem o tamanho devem ser truncados.
Por exemplo, considere uma coluna definida como nvarchar(100) que armazena 180 bytes de caracteres japoneses. Neste exemplo, os dados da coluna são atualmente codificados usando UCS-2 ou UTF-16, que usa 2 bytes por caractere. Converter o tipo de coluna em varchar(200) não é suficiente para impedir o truncamento de dados, porque o novo tipo de dados só pode armazenar 200 bytes, mas os caracteres japoneses exigem 3 bytes quando codificados em UTF-8. A coluna deve ser definida como varchar(270) para evitar a perda de dados através do truncamento de dados.
Portanto, você deve saber com antecedência qual é o tamanho de byte projetado para a definição de coluna, antes de converter dados existentes para UTF-8, e ajustar o novo tamanho de tipo de dados de acordo. Consulte o script Transact-SQL ou o Bloco de Anotações SQL noGitHub
Para alterar o agrupamento de colunas e o tipo de dados em uma tabela existente, use um dos métodos descritos em Definir ou alterar o agrupamento de colunas.
Para alterar o agrupamento de banco de dados, permitindo que novos objetos herdem o agrupamento de banco de dados por padrão, ou para alterar o agrupamento de servidor, permitindo que novos bancos de dados herdem o agrupamento do sistema por padrão, consulte a seção Tarefas relacionadas deste artigo.
Tarefas relacionadas
Tarefa | Artigo |
---|---|
Descreve como definir ou alterar o agrupamento da instância do SQL Server. Alterar o agrupamento do servidor não altera o agrupamento de bancos de dados existentes. | Definir ou alterar o agrupamento do servidor |
Descreve como definir ou alterar o agrupamento de um banco de dados de usuário. A alteração de um agrupamento de banco de dados não altera o agrupamento de colunas de tabela existentes. | Definir ou alterar o agrupamento do banco de dados |
Descreve como definir ou alterar o agrupamento de uma coluna no banco de dados. | Definir ou alterar o agrupamento de colunas |
Descreve como retornar informações de colação ao nível do servidor, da base de dados ou da coluna. | Exibir informações de agrupamento |
Descreve como escrever instruções Transact-SQL que são mais portáteis de um idioma para outro ou oferecem suporte a vários idiomas com mais facilidade. | Escrever declarações Transact-SQL internacionais |
Descreve como alterar o idioma das mensagens de erro e as preferências de como os dados de data, hora e moeda são usados e exibidos. | Definir um idioma de sessão |
Conteúdo relacionado
- Práticas Recomendadas para Alteração de Intercalação do SQL Server
- Usar o formato de caractere unicode para importar ou exportar dados (SQL Server)
- Escrever declarações Transact-SQL internacionais
- Migração de práticas recomendadas do SQL Server para Unicode
- Unicode Consortium
- Padrão Unicode
- Suporte UTF-8 no driver OLE DB para o SQL Server
- Nome de agrupamento do SQL Server (Transact-SQL)
- Nome de agrupamento do Windows (Transact-SQL)
- Apresentando o suporte UTF-8 para SQL Server
- COLLATE (Transact-SQL)
- Precedência do agrupamento
- Agrupamentos de banco de dados contidos
- Escolher um Idioma ao Criar um Índice de Full-Text
- sys.fn_helpcollations (Transact-SQL)
- Single-Byte e conjuntos de caracteres multibyte