A partir do SQL Server 2019 (atualmente em beta / "Community Tech Preview"), há suporte nativo para o UTF-8 por meio de uma nova série de agrupamentos do UTF-8. NO ENTANTO, ter a capacidade de usar UTF-8 não significa que você deveria. Existem desvantagens definidas no uso de UTF-8, como:
- Somente os primeiros 128 pontos de código têm 1 byte (ou seja, o conjunto ASCII padrão de 7 bits)
- Os próximos quase 2000 pontos de código são 2 bytes, portanto, não há economia de espaço em relação ao UTF-16 /
NVARCHAR
- Os restantes 63k pontos de código no BMP (ou seja, o intervalo U + 0800 - U + FFFF) são todos de 3 bytes, portanto, 1 byte maior que o mesmo caractere em UTF-16 /
NVARCHAR
.
- Basta dizer: Os caracteres suplementares têm 4 bytes em ambas as codificações, portanto, não há diferença de espaço.
- Embora você possa economizar espaço usando o UTF-8, há uma chance muito boa de afetar o desempenho ao fazê-lo.
O que realmente se resume é o seguinte: UTF-8 é um design de formato de armazenamento para permitir que sistemas de 8 bits (normalmente projetados em torno do ASCII e ASCII Extended - Code Pages) usem o Unicode sem quebrar nada ou exigir qualquer modificação dos existentes arquivos para manter as coisas funcionando. O UTF-8 é maravilhoso para sistemas de arquivos e redes, mas os dados armazenados no SQL Server também não são. O fato de os dados estarem na sua maioria (ou inteiramente) dentro do intervalo ASCII padrão requer menos espaço que os mesmos dados quando armazenados como UTF-16 / NVARCHAR
é um efeito colateral. Claro, é um efeito colateral que pode ser útil, mas essa decisão precisa ser tomada por alguém que entenda os dados e as conseqüências / desvantagens dessa decisão. Isto énão é um recurso para uso geral.
Além disso, o principal caso de uso do UTF-8 (no SQL Server) é o código do aplicativo que já está usando o UTF-8, possivelmente já com outro RDBMS que o suporta, e não há desejo ou capacidade de atualizar o código do aplicativo / esquema do banco de dados para usar NVARCHAR
tipos de dados (para tabelas, variáveis, parâmetros etc.) ou prefixar literais de seqüência de caracteres com um "N" maiúsculo. O objetivo é o mesmo do motivo da existência do UTF-8: habilitar o código do aplicativo para usar Unicode sem alterar a estrutura geral ou tornar inválidos os dados existentes. Se isso descreve sua situação, use UTF-8, mas esteja ciente de que ainda existem alguns bugs / problemas.
Se você não tiver uma necessidade explícita de que o Unicode funcione sem usar NVARCHAR
literais de seqüência de caracteres com prefixo "N" maiúsculo, o único outro cenário em que o UTF-8 é um benefício é se você tiver MUITOS dados ASCII na maioria das vezes padrão que precisam permitir Caracteres Unicode e você está usando NVARCHAR(MAX)
(o que significa que a compactação de dados não funcionará), e a tabela é atualizada com frequência (portanto, o Índice de Colunas de Cluster em cluster provavelmente não vai realmente ajudar).
Para mais detalhes, consulte o meu post:
Suporte nativo a UTF-8 no SQL Server 2019: Salvador ou Falso Profeta?