Definir ou alterar o agrupamento de colunas
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada SQL do Azure
Você pode substituir o agrupamento de dados do banco de dados para char , varchar , texto , nchar , nvarchar e ntext especificando um agrupamento diferente para uma coluna específica de uma tabela e usando um dos seguintes:
A cláusula COLLATE de CREATE TABLE e ALTER TABLE, como visto nos exemplos abaixo.
Conversão no local. Considere uma das tabelas existentes definidas abaixo:
-- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC); -- VARCHAR column is encoded the Latin code page and therefore is not Unicode capable CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI);
Para converter a coluna diretamente para usar UTF-8, execute uma instrução
ALTER COLUMN
que defina o tipo de dados necessário e um agrupamento compatível com UTF-8.ALTER TABLE dbo.MyTable ALTER COLUMN CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8
Este método é fácil de implementar, no entanto, é uma operação de bloqueio possível que pode se tornar um problema para tabelas grandes e aplicativos ocupados.
Copie e substitua. Considere uma das tabelas existentes definidas abaixo:
-- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC); GO -- VARCHAR column is encoded using the Latin code page and therefore is not Unicode capable CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI); GO
Para converter a coluna para usar UTF-8, copie os dados para uma nova tabela onde a coluna de destino já é o tipo de dados necessário e um agrupamento habilitado para UTF-8 e, em seguida, substitua a tabela antiga:
CREATE TABLE dbo.MyTableNew (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8); GO INSERT INTO dbo.MyTableNew SELECT * FROM dbo.MyTable; GO DROP TABLE dbo.MyTable; GO EXEC sp_rename 'dbo.MyTableNew', 'dbo.MyTable'; GO
Este método é muito mais rápido do que a conversão no local, mas lidar com esquemas complexos com muitas dependências (FKs, PKs, triggers, DFs) e sincronizar o final da tabela (se o banco de dados estiver em uso) requer mais planeamento.
Para obter mais informações, consulte Collation and Unicode Support.
SQL Server Management Studio. Para obter mais informações, consulte Modificar colunas (Mecanismo de Banco de Dados).
Usando a propriedade Column.Collation no SQL Server Management Objects (SMO).
Não é possível alterar o agrupamento de uma coluna atualmente referenciada por qualquer um dos seguintes:
- Uma coluna computada
- Um índice
- Estatísticas de distribuição, geradas automaticamente ou pela declaração
CREATE STATISTICS
- Uma restrição CHECK (de verificação)
- Uma restrição de chave estrangeira
Quando se trabalha com tempdb, a cláusula COLLATE inclui uma opção database_default para especificar que uma coluna em uma tabela temporária utilize o padrão de agrupamento do banco de dados do utilizador atual para a conexão, em vez do agrupamento de tempdb.
Agrupamentos e colunas de texto
Você pode inserir ou atualizar valores em uma coluna de texto cujo agrupamento é diferente da página de códigos do agrupamento padrão do banco de dados. O SQL Server converte implicitamente os valores para o agrupamento da coluna.
Colações e tempdb
O banco de dados tempdb é criado sempre que o SQL Server é iniciado e tem o mesmo agrupamento padrão que o modelo banco de dados. Isso geralmente é o mesmo que o agrupamento padrão da instância. Se você criar um banco de dados de usuário e especificar um agrupamento padrão diferente de modelo, o banco de dados de usuário terá um agrupamento padrão diferente de tempdb. Todos os procedimentos armazenados temporários ou tabelas temporárias são criados e armazenados em tempdb. Isso significa que todas as colunas implícitas em tabelas temporárias e todas as constantes, variáveis e parâmetros padrão coercitivo em procedimentos armazenados temporários têm agrupamentos diferentes de objetos comparáveis criados em tabelas permanentes e procedimentos armazenados.
Isso pode levar a problemas com uma incompatibilidade de agrupamentos entre bancos de dados definidos pelo usuário e objetos de banco de dados do sistema. Por exemplo, uma instância do SQL Server usa o agrupamento de Latin1_General_CS_AS e você executa as seguintes instruções:
CREATE DATABASE TestDB COLLATE Estonian_CS_AS;
USE TestDB;
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );
Neste sistema, o banco de dados tempdb usa o agrupamento Latin1_General_CS_AS com página de código 1252 e TestDB
e TestPermTab.Col1
usam o agrupamento Estonian_CS_AS
com página de código 1257. Por exemplo:
USE TestDB;
GO
-- Create a temporary table with the same column declarations
-- as TestPermTab
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar );
INSERT INTO #TestTempTab
SELECT * FROM TestPermTab;
GO
Com o exemplo anterior, o banco de dados tempdb usa o agrupamento Latin1_General_CS_AS e TestDB
e TestTab.Col1
usam o agrupamento Estonian_CS_AS
. Por exemplo:
SELECT * FROM TestPermTab AS a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1;
Como tempdb usa o agrupamento de servidor padrão e TestPermTab.Col1
usa um agrupamento diferente, o SQL Server retorna este erro: "Não é possível resolver o conflito de agrupamento entre 'Latin1_General_CI_AS_KS_WS' e 'Estonian_CS_AS' na operação de igualdade."
Para evitar o erro, você pode usar uma das seguintes alternativas:
Especifique que a coluna da tabela temporária use o agrupamento padrão do banco de dados do usuário, não tempdb. Isso permite que a tabela temporária trabalhe com tabelas formatadas de forma semelhante em vários bancos de dados, se isso for exigido do seu sistema.
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar COLLATE database_default );
Especifique o agrupamento correto para a coluna
#TestTempTab
:CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar COLLATE Estonian_CS_AS );
Ver também
Definir ou alterar o agrupamento do servidor
Definir ou alterar o agrupamento de banco de dados
Suporte a Agrupamento e Unicode