Eu simplesmente não entendo. Veja esta consulta SQL:
select nchar(65217) -- ﻁ
select nchar(65218) -- ﻂ
select nchar(65219) -- ﻃ
select nchar(65220) -- ﻄ
if nchar(65217) = nchar(65218)
print 'equal'
if nchar(65217) = nchar(65219)
print 'equal'
if nchar(65217) = nchar(65220)
print 'equal'
Com base na relação transitiva , significa que o SQL Server considera todos eles como o mesmo caractere.
No entanto, em outros ambientes, digamos, por exemplo, C#, eles não são os mesmos.
O que estou confuso é:
- Como funciona a comparação de strings no SQL Server
- Por que a comparação não se comporta da mesma forma em uma máquina e em uma plataforma, mas em ambientes diferentes
- Esses 4 caracteres representam um personagem compreensível para humanos. Por que eles são tão abundantes no mapa de caracteres Unicode?
É claro que isso resulta em problemas tremendos, porque estou trabalhando em um aplicativo de processamento de texto e os dados vêm de quase todos os lugares e preciso normalizar o texto antes de processá-lo.
Se eu souber o motivo da diferença, posso encontrar uma solução para lidar com isso. Obrigada.
Todos os dados de caracteres no SQL Server são associados a um agrupamento, que determina o domínio de caracteres que podem ser armazenados, bem como as regras usadas para comparar e classificar os dados. O agrupamento se aplica a dados Unicode e não Unicode.
O SQL Server inclui 3 categorias amplas de agrupamentos: binário, herdado e Windows. Os agrupamentos na categoria binária (
_BIN
sufixo) usam os pontos de código subjacentes para comparar, de modo que as comparações de igualdade retornem diferentes se os pontos de código forem diferentes, independentemente do caractere. Os agrupamentos herdados (SQL_
prefixo) e do Windows fornecem semântica de classificação e comparação para as regras de dicionário mais naturais. Isso permite comparações para considerar maiúsculas e minúsculas, acentos, largura e Kana. Os agrupamentos do Windows fornecem regras mais robustasword-sort
que se alinham estreitamente com o sistema operacional Windows, enquanto os agrupamentos herdados consideram apenas caracteres únicos.O exemplo abaixo ilustra as diferenças entre o Windows e o agrupamento binário com o caractere Teth:
Os motivos pelos quais o Unicode pode conter diferentes pontos de código para glifos idênticos são descritos em http://en.wikipedia.org/wiki/Duplicate_characters_in_Unicode . Resumindo, pode ser para compatibilidade herdada ou os personagens não são canonicamente equivalentes. Observe que o caractere Teth
ﻁ
é usado em diferentes idiomas ( http://en.wikipedia.org/wiki/Teth ).Isso tem algo a ver com o
COLLATION
seu banco de dados ( mais informações em BOL ).Não tenho certeza do idioma do caractere específico com o qual você está tendo problemas (suponho que persa com base neste tópico), mas se você especificar o agrupamento correto no operador de igualdade, obterá resultados precisos.