Para fins de demonstração, tenho uma tabela de exemplo com uma varchar
coluna chamada numberstring
com os valores:
-4
32
0
4
16
8
-8
1024
Ao selecionar usando ORDER BY numberstring
, acho que usuários diferentes obtêm resultados diferentes.
Alguns recebem:
-4, -8, 0, 1024, 16, 32, 4, 8
enquanto alguns recebem:
0, 1024, 16, 32, -4, 4, -8, 8
De alguma forma, o segundo resultado parece ignorar o sinal de menos, mesmo que os dados sejam classificados como dados de string.
Até onde eu sei, o servidor subjacente é uma instalação padrão do Microsoft SQL Server express, sem nenhuma opção especial. A versão está nos últimos anos, mas usuários com a mesma versão ainda relatam resultados diferentes.
Há algo na configuração que afeta os resultados e como posso visualizar isso no SSMS?
O servidor de banco de dados e o SSMS são configurados na Austrália apenas com os padrões, até onde eu saiba. O tipo de dados é varchar(max)
.
A ordem de classificação da string é determinada pelo agrupamento. Usuários em locais diferentes esperam que os dados sejam classificados de forma diferente e o agrupamento codifica essas expectativas.
Quando não especificado explicitamente, o agrupamento de uma coluna é herdado do nível de banco de dados/instância. A instalação do SQL Server define um agrupamento em nível de instância diferente, dependendo do que o usuário escolheu ou do padrão inferido das configurações de idioma do Windows. Da documentação :
Provavelmente, alguns de seus usuários estão usando o agrupamento SQL_Latin1_General_CP1_CI_AS compatível com versões anteriores por padrão, enquanto outros em outras partes do mundo podem estar usando algo como Latin1_General_100_CI_AS:
db<>violino
Isso pode ter acontecido porque alguns de seus usuários têm sua localidade do Windows definida como English (Estados Unidos) , enquanto outros têm English (Austrália) .
Uma maneira de resolver esse problema em seus scripts é usar a
COLLATE
cláusula opcional em suaCREATE DATABASE
instrução ( documentation ).Você pode ver o agrupamento padrão para cada banco de dados usando:
Se isso retornar um
NULL
, é provável que o banco de dados não esteja online ou esteja fechado devido aAUTO_CLOSE
(que é o padrãoON
para o SQL Server Express). Consulte a documentação parasys.databases
.A ordenação no nível da instância com:
Os agrupamentos SQL_* mais antigos usam regras diferentes para dados Unicode e não Unicode: