Quel est le but de COLLATIONS pour les colonnes nvarchar (Unicode)?

Je lis beaucoup à ce sujet.

Encore quelques questions:

Je ne parle pas de cas sensible ici …

Merci d'avance.

Stocker et représenter des personnages est une chose, et savoir les sortinger et les comparer en est une autre.

Les données Unicode, stockées dans les types XML et N -prefixed dans SQL Server, peuvent représenter tous les caractères dans tous les langages (pour la plupart, et c'est son objective) avec un seul jeu de caractères. Donc, pour datatables XML / NCHAR / NVARCHAR (je laisse NTEXT comme il ne devrait plus être utilisé), les classments ne modifient pas les caractères qui peuvent être stockés. Pour datatables CHAR et VARCHAR , les classments affectent ce qui peut être stocké lorsque chaque classment pointe sur une page de code particulière, qui détermine ce qui peut être stocké dans les valeurs 128 – 255.

Maintenant, bien qu'il existe un ordre de sorting par défaut pour tous les caractères, cela ne peut pas fonctionner dans toutes les langues et cultures. Il existe de nombreux langages partageant certains / plusieurs / tous les caractères, mais ils ont des règles différentes pour les sortinger. Par exemple, la lettre "C" vient avant la lettre "D" dans la plupart des alphabets qui utilisent ces lettres. En anglais américain, une combinaison de "C" et "H" (c'est-à-dire "CH" comme deux lettres séparées) viendrait naturellement avant toute string commençant par un "D". Mais, dans quelques langues, la combinaison de deux lettres de "CH" est spéciale et sortinge après "D":

 IF ( N'CH' COLLATE Czech_CI_AI > N'D' COLLATE Czech_CI_AI AND N'C' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI AND N'CI' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI ) PRINT 'Czech_CI_AI'; IF ( N'CH' COLLATE Czech_100_CI_AI > N'D' COLLATE Czech_100_CI_AI AND N'C' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI AND N'CI' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI ) PRINT 'Czech_100_CI_AI'; IF ( N'CH' COLLATE Slovak_CI_AI > N'D' COLLATE Slovak_CI_AI AND N'C' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI AND N'CI' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI ) PRINT 'Slovak_CI_AI'; IF ( N'CH' COLLATE Slovak_CS_AS > N'D' COLLATE Slovak_CS_AS AND N'C' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS AND N'CI' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS ) PRINT 'Slovak_CS_AS'; IF ( N'CH' COLLATE Latin1_General_100_CI_AS > N'D' COLLATE Latin1_General_100_CI_AS AND N'C' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS AND N'CI' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS ) PRINT 'Latin1_General_100_CI_AS' ELSE PRINT 'Nope!'; 

Résultats:

 Czech_CI_AI Czech_100_CI_AI Slovak_CI_AI Slovak_CS_AS Nope! 

Pour voir des exemples de règles de sorting dans différentes cultures, veuillez consulter: Tableaux de classment.

En outre, dans certaines langues, certaines lettres ou combinaisons de lettres correspondent à d'autres lettres d'une manière différente de la plupart des autres langues. Par exemple, seulement en danois, un «å» équivaut à «aa». Mais, le "å" n'équivaut pas à un seul "a":

 IF (N'aa' COLLATE Danish_Greenlandic_100_CI_AI = N'å' COLLATE Danish_Greenlandic_100_CI_AI AND N'a' COLLATE Danish_Greenlandic_100_CI_AI <> N'å' COLLATE Danish_Greenlandic_100_CI_AI ) PRINT 'Danish_Greenlandic_100_CI_AI'; IF ( N'aa' COLLATE Danish_Norwegian_CI_AI = N'å' COLLATE Danish_Norwegian_CI_AI AND N'a' COLLATE Danish_Norwegian_CI_AI <> N'å' COLLATE Danish_Norwegian_CI_AI ) PRINT 'Danish_Norwegian_CI_AI'; IF ( N'aa' COLLATE Latin1_General_100_CI_AI = N'å' COLLATE Latin1_General_100_CI_AI AND N'a' COLLATE Latin1_General_100_CI_AI <> N'å' COLLATE Latin1_General_100_CI_AI ) PRINT 'Latin1_General_100_CI_AI' ELSE PRINT 'Nope!'; 

Résultats:

 Danish_Greenlandic_100_CI_AI Danish_Norwegian_CI_AI Nope! 

Tout cela est très complexe, et je n'ai même pas mentionné le traitement des langues de droite à gauche (hébreu et arabe), chinois, japonais, combinant des caractères, etc.

Si vous voulez un aperçu approfondi des règles, consultez l' algorithm de collation Unicode (UCA) . Les exemples ci-dessus sont basés sur des exemples de cette documentation, même si je ne crois pas que toutes les règles de l'UCA ont été implémentées, d'autant plus que les classments Windows (collations ne commençant pas par SQL_ ) sont basés sur Unicode 5.0 ou 6.0. le operating system que vous utilisez et la version du .NET Framework installée (voir SortVersion pour plus de détails).

C'est ce que font les Collations. Si vous souhaitez voir toutes les classments disponibles, exécutez simplement les opérations suivantes:

 SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name]; 

Si vous avez un char, alors il n'y a pas d'ordre. Mais si vous commandz par exemple NOMS de PERSONNES – différents caractères spéciaux dans différentes langues sont commandés différemment selon la collation.

d'abord, un classment peut être sensible à la casse – montrer tout B avant b – et les seconds caractères spéciaux ont des règles spéciales selon la collation.

La documentation est plutôt bonne à ce sujet.

Je pense que l'affiche originale est confuse entre CODE PAGES et COLLATIONS.

Le "n" dans nvarchar / nchar vous permet de stocker du text en utilisant le jeu de nombres unicode qui est assez grand pour incorporer tous les caractères dans toutes les langues (en principe de toute façon) avec un numéro unique. Ce n'est pas en soi lié à des collations. nvarchar / nchar n'utilise pas CODE PAGES pour encoder / décoder la signification de chaque code de caractère.

Les classments définissent l'ordre de sorting des caractères et les variantes de caractères qui doivent être traitées comme identiques. nvarchar / nchar UTILISE COLLATIONS pour définir ces distinctions.