2010-11-18 3 views
2

Je suis sur SQL Server 2008 R2 dev, le classement par défaut du serveur est Cyrillic_General_CI_ASPourquoi le COLLATE explicite ne remplace-t-il pas le classement de la base de données?

exécution dans SSMS
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS
ou

SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI 

sorties

  • eEaAaAeEc? a (dans ocntext de/use dbName) de la base de données avec collation par défaut Cyrillic_General_CI_AS
  • éÉâÂàÀëËçæà sur la base de données avec Latin1_General_CI_AS de classement par défaut

Pourquoi?

Répondre

6

Ces littéraux de caractère dans vos requêtes sont d'abord convertis en chaînes varchar sous n'importe quel classement pour lequel la base de données est définie, puis votre collation cast prend effet.

Si vous voulez passer littéraux ces caractères et assurer que tous les caractères sont fidèlement représentés, il est préférable de les transmettre comme littéraux nvarchar:

create database CollTest collate Cyrillic_General_CI_AS 
go 
use CollTest 
go 
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS 
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI 
go 
SELECT N'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS 
SELECT N'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI 
go 

Sortie:

----------- 
eEaAaAeEc?a 

(1 row(s) affected) 


----------- 
eEaAaAeEc?a 

(1 row(s) affected) 


----------- 
éÉâÂàÀëËçæà 

(1 row(s) affected) 


----------- 
éÉâÂàÀëËçæà 

(1 row(s) affected) 
1

Selon this character table Cyrillic_General_CI_AS ne contient pas le caractère æ. Cela expliquerait pourquoi vous voyez un ? à sa place si vous utilisez vraiment les valeurs par défaut au lieu de ce que vous avez dans vos instructions select.

Questions connexes