Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server retorna ??? quando a coluna é atualizada com caracteres tailandeses


Não há muitas informações fornecidas na pergunta. Tudo o que sabemos é:
  • A coluna está usando o agrupamento de Thai_CI_AS (pelo menos foi o que parece que a pergunta está afirmando)
  • Caracteres tailandeses estão sendo transmitidos
  • O que é armazenado na coluna é:???

No entanto, a partir disso, podemos deduzir duas coisas:

  1. A string de entrada não é um NVARCHAR parâmetro / variável, nem é um literal de string prefixado com um "N" maiúsculo,

    e

  2. O Collation padrão para o banco de dados no qual a consulta está sendo executada (não necessariamente o banco de dados no qual a tabela existe) é não um Collation tailandês.

Não sabemos se a coluna de destino é VARCHAR ou NVARCHAR , mas isso não importa se o Collation da coluna for um Thai Collation (já que permitirá VARCHAR data para conter caracteres tailandeses e NVARCHAR funcionaria independentemente).

Se ou :

  • a string de entrada usa um NVARCHAR parâmetro (ou se for literal de string, então prefixe com um "N" maiúsculo),

    ou

  • a consulta foi executada em um banco de dados que possui um Collation padrão tailandês

então os caracteres tailandeses seriam armazenados conforme o esperado.

O exemplo a seguir demonstra esse comportamento. Eu uso um caractere tailandês Khomut U+0E5B em uma instância com um Korean_100_CS_AS_KS_WS_SC Agrupamento padrão no nível da instância. A coluna de destino tem um agrupamento de Thai_CI_AS . Primeiro, enquanto o banco de dados "atual" é aquele que não tenho um Collation padrão tailandês, adiciono o caractere duas vezes:uma vez prefixado com "N" e uma vez sem prefixo na string literal:
USE [tempdb];
-- DROP TABLE #Thai;
CREATE TABLE #Thai (ID INT IDENTITY(1, 1), Col1 VARCHAR(50) COLLATE Thai_CI_AS);

-- In a DB with a non-Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');
INSERT INTO #Thai (Col1) VALUES (N'๛');

Em seguida, mudo para um banco de dados que faz tenha um Collation padrão tailandês e insira apenas a string não prefixada (não há necessidade real de testar novamente a string prefixada com "N"):
USE [other_db];

-- In a DB with a Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');


SELECT * FROM #Thai;

O resultado é:
ID  Col1
1   ?
2   ๛
3   ๛

Como você pode ver (o ponto # abaixo está relacionado ao ID # nos resultados acima):
  1. A string não prefixada com "N", usada em um banco de dados usando um Collation padrão não tailandês, foi traduzida para ?
  2. A string com prefixo "N", também usada em um banco de dados usando um Collation padrão não tailandês, armazenou o valor corretamente
  3. A string não prefixada com "N", usada em um banco de dados que tem um Collation padrão tailandês, armazenou o valor corretamente