web-dev-qa-db-fra.com

Que fait 'COLLATE SQL_Latin1_General_CP1_CI_AS'?

J'ai une requête SQL pour créer la base de données dans SQLServer comme indiqué ci-dessous:

create database yourdb
on
( name = 'yourdb_dat',
  filename = 'c:\program files\Microsoft sql server\mssql.1\mssql\data\yourdbdat.mdf',
  size = 25mb,
  maxsize = 1500mb,
  filegrowth = 10mb )
log on
( name = 'yourdb_log',
  filename = 'c:\program files\Microsoft sql server\mssql.1\mssql\data\yourdblog.ldf',
  size = 7mb,
  maxsize = 375mb,
  filegrowth = 10mb )
COLLATE SQL_Latin1_General_CP1_CI_AS;
go

Ça fonctionne bien.

Bien que le reste du code SQL soit clair, je suis assez confus quant à la fonctionnalité de COLLATE SQL_Latin1_General_CP1_CI_AS.

Quelqu'un peut-il m'expliquer cela? De plus, j'aimerais savoir si la création de la base de données de cette manière est une pratique exemplaire.

111
Thunder

Il définit le mode de tri du serveur de base de données. dans ce cas:

SQL_Latin1_General_CP1_CI_AS

se divise en parties intéressantes:

  1. latin1 permet au serveur de traiter les chaînes à l'aide du jeu de caractères latin 1, essentiellement ascii
  2. CP1 signifie Code Page 1252
  3. CI comparaisons insensibles à la casse pour que 'ABC' soit égal à 'abc'
  4. AS sensible aux accents, donc 'ü' n'est pas égal à 'u'

P.S. Pour des informations plus détaillées, assurez-vous de lisez la réponse de @ solomon-rutzky .

215
Kris

Sachez que la réponse acceptée est un peu incomplète. Oui, au niveau le plus fondamental, Collation gère le tri. MAIS, les règles de comparaison définies par le classement choisi sont utilisées à de nombreux endroits en dehors des requêtes utilisateur par rapport aux données utilisateur.

Si "qu'est-ce que COLLATE SQL_Latin1_General_CP1_CI_AS fait?" signifie "Que fait la clause COLLATE de CREATE DATABASE?", alors:

La clause COLLATE {collation_name} de l'instruction CREATE DATABASE spécifie le classement par défaut de la base de données et et non . Serveur; Les classements par défaut au niveau de la base de données et du serveur contrôlent différentes opérations.

Contrôles serveur (c'est-à-dire instance) :

  • Classement au niveau de la base de données pour les bases de données système: master, model, msdb et tempdb.
  • En raison du contrôle du classement de tempdb au niveau de la base de données, il s'agit du classement par défaut pour les colonnes de chaîne dans les tables temporaires (globales et locales), mais pas les variables de table.
  • En raison du contrôle du classement de master au niveau de la base de données, il s'agit alors du classement utilisé pour des données de niveau serveur , telles que les noms de base de données (c.-à-d. name colonne dans sys.databases), noms de connexion, etc.
  • Traitement des noms de paramètres/variables
  • Traitement des noms de curseur
  • Traitement des étiquettes GOTO
  • Classement par défaut utilisé pour les bases de données nouvellement créées lorsque la clause COLLATE est manquante

Contrôles de niveau base de données :

  • Classement par défaut utilisé pour les colonnes de chaîne nouvellement créées (CHAR, VARCHAR, NCHAR, NVARCHAR, TEXT et NTEXT - mais don ' t utilisez TEXT ou NTEXT) lorsque la clause COLLATE est absente de la définition de colonne. Cela vaut pour les deux instructions CREATE TABLE et ALTER TABLE ... ADD.
  • Classement par défaut utilisé pour les littéraux de chaîne (c.-à-d. 'some text') et les variables de chaîne (c.-à-d. @StringVariable). Ce classement n'est utilisé que lors de la comparaison de chaînes et de variables avec d'autres chaînes et variables. Lors de la comparaison de chaînes/variables avec des colonnes, le classement de la colonne sera utilisé.
  • La collation utilisée pour les métadonnées de niveau base de données , telles que les noms d'objet (ie sys.objects), les noms de colonne (ie sys.columns), les noms d'index ( ie sys.indexes), etc.
  • Le classement utilisé pour objets de niveau base de données : tables, colonnes, index, etc.

Aussi:

  • ASCII est un codage de 8 bits (pour une utilisation courante; techniquement, "ASCII" est de 7 bits avec des valeurs de caractère de 0 à 127 et "ASCII étendu" est de 8 bits avec des valeurs de caractère de 0 à 255). Ce groupe est le même à travers les cultures.
  • La page de code est la partie "étendue" de l'ASCII étendu et contrôle les caractères utilisés pour les valeurs 128 à 255. Ce groupe varie d'une culture à l'autre.
  • Latin1 ne ne signifie pas "ASCII" car la norme ASCII ne couvre que les valeurs 0 - 127, et tout Les pages de code (qui peuvent être représentées dans SQL Server et même NVARCHAR) mappent ces mêmes 128 valeurs aux mêmes caractères.

Si "qu'est-ce que COLLATE SQL_Latin1_General_CP1_CI_AS fait?" signifie "Que fait ce classement particulier?", alors:

  • Étant donné que le nom commence par SQL_, il s'agit d'un classement SQL Server et non d'un classement Windows. Celles-ci sont définitivement obsolètes, même si elles ne sont pas officiellement obsolètes, et concernent principalement la compatibilité pré-SQL Server 2000. Malheureusement, malheureusement, SQL_Latin1_General_CP1_CI_AS est très courant, car il s’agit de la valeur par défaut lors d’une installation sur un système d’exploitation utilisant l’anglais américain comme langue. Ces collations doivent être évitées dans la mesure du possible.

    Les classements Windows (ceux avec des noms et non commençant par SQL_) sont plus récents, plus fonctionnels, ont un tri cohérent entre VARCHAR et NVARCHAR pour le les mêmes valeurs et sont mises à jour avec des poids de tri supplémentaires/corrigés et des mappages majuscules/minuscules. Ces classements ne présentent pas non plus le problème de performances potentiel des classements SQL Server: impact sur les index lors du mélange de types VARCHAR et NVARCHAR .

  • Latin1_General est la culture/les paramètres régionaux.
    • Pour les données NCHAR, NVARCHAR et NTEXT, cela détermine les règles linguistiques utilisées pour le tri et la comparaison.
    • Pour CHAR, VARCHAR et TEXT données (colonnes, littéraux et variables), cela détermine:
      • règles linguistiques utilisées pour le tri et la comparaison.
      • page de code utilisée pour encoder les caractères. Par exemple, Latin1_General classements utilisent la page de code 1252, Hebrew classements utilisent la page de code 1255, etc.
  • CP{code_page} ou {version}

    • Pour classements SQL Server : CP{code_page}, est la page de code 8 bits qui détermine les caractères mappés sur les valeurs 128 - 255. Bien qu'il existe quatre pages de code pour Double- Jeux de caractères d'octet (DBCS) pouvant utiliser des combinaisons de 2 octets pour créer plus de 256 caractères. Ces combinaisons ne sont pas disponibles pour les classements SQL Server.
    • Pour classements Windows : {version}, même s'il ne figure pas dans tous les noms de classements, fait référence à la version de SQL Server dans laquelle le classement a été introduit (pour la plupart). Les classements Windows sans numéro de version dans le nom sont version 80 (signifiant SQL Server 2000 en tant que version 8.0). Toutes les versions de SQL Server ne comportent pas de nouveaux classements. Il existe donc des lacunes dans les numéros de version. Il y en a qui sont 90 (pour SQL Server 2005, version 9.0), la plupart sont 100 (pour SQL Server 2008, version 10.0), et un petit ensemble a 140 ( pour SQL Server 2017, version 14.0).

      J'ai dit "pour la plupart" parce que les classements se terminant par _SC ont été introduits dans SQL Server 2012 (version 11.0), mais les données sous-jacentes n'étaient pas nouvelles, ils ont simplement ajouté la prise en charge de caractères supplémentaires les fonctions. Ces terminaisons existent donc pour les classements de version 90 et 100, mais à partir de SQL Server 2012 uniquement.

  • Ensuite, vous avez les sensibilités, qui peuvent être n'importe quelle combinaison des éléments suivants, mais toujours spécifiées dans cet ordre:
    • CS = sensible à la casse ou CI = insensible à la casse
    • AS = sensible aux accents ou AI = insensible aux accents
    • KS = sensible au type Kana ou manquant = non sensible au type Kana
    • WS = sensible à la largeur ou manquant = insensible à la largeur
    • VSS = sensible au sélecteur de variation (disponible uniquement dans les classements de la version 140) ou manquant = sélecteur de variation insensible
  • Dernière pièce facultative:

    • _SC à la fin signifie "Prise en charge de caractères supplémentaire". Le "support" n'affecte que la manière dont les fonctions intégrées interprètent les paires de substitution (c'est-à-dire comment les caractères supplémentaires sont codés en UTF-16). Sans _SC à la fin (ou _140_ au milieu), les fonctions intégrées ne voient pas un seul caractère supplémentaire, mais plutôt deux points de code sans signification qui constituent la paire de substitution. Cette fin peut être ajoutée à tout classement non binaire, version 90 ou 100.
    • _BIN ou _BIN2 à la fin signifie un tri et une comparaison "binaire". Les données sont toujours stockées de la même manière, mais il n'y a pas de règles linguistiques. Cette fin n'est jamais combinée avec aucune des 5 sensibilités ou _SC. _BIN est le style le plus ancien, et _BIN2 est le style le plus récent et le plus précis. Si vous utilisez SQL Server 2005 ou une version plus récente, utilisez _BIN2. Pour plus de détails sur les différences entre _BIN et _BIN2, veuillez consulter: Différences entre les différents classements binaires (Cultures, Versions et BIN vs BIN2) .
    • _UTF8 est une nouvelle option à partir de SQL Server 2019. Il s'agit d'un codage sur 8 bits qui permet de stocker des données Unicode dans les types de données VARCHAR et CHAR (mais non obsolètes TEXT Type de données). Cette option ne peut être utilisée que sur les classements qui prennent en charge des caractères supplémentaires (à savoir les classements de version 90 ou 100 avec _SC dans leur nom et les classements de la version 140). Il existe également un seul et unique classement _UTF8 binaire (_BIN2, pas _BIN).

      VEUILLEZ NOTER: UTF-8 a été conçu/créé pour la compatibilité avec les environnements/codes configurés pour les codages 8 bits tout en prenant en charge Unicode. Même s'il existe quelques scénarios où UTF-8 peut permettre d'économiser jusqu'à 50% d'espace par rapport à NVARCHAR, il s'agit d'un effet secondaire qui a un coût légèrement négatif sur les performances dans la plupart des opérations. Si vous en avez besoin pour des raisons de compatibilité, le coût est acceptable. Si vous voulez cela pour gagner de la place, vous feriez mieux de tester et de tester à nouveau. Les tests incluent toutes les fonctionnalités et plus que quelques lignes de données. Sachez que les classements UTF-8 fonctionnent mieux lorsque TOUTES les colonnes et la base de données elle-même utilisent des données VARCHAR (colonnes, variables, littéraux de chaîne) avec un classement _UTF8. C'est l'état naturel pour quiconque l'utilise pour des raisons de compatibilité, mais pas pour ceux qui espèrent l'utiliser pour gagner de la place. Soyez prudent lorsque vous mélangez des données VARCHAR à l'aide d'un classement _UTF8 avec des données VARCHAR à l'aide de classements non -_UTF8 ou NVARCHAR, car vous risqueriez de subir un comportement/une perte de données inhabituel. Pour plus de détails sur les nouveaux classements UTF-8, veuillez consulter: Prise en charge native de UTF-8 dans SQL Server 2019: Sauveur ou faux prophète?

48
Solomon Rutzky

Le CP1 signifie "Code Page 1" - techniquement, cela se traduit par la page de codes 1252.

23
Chris Halcrow

Le mot clé COLLATE spécifie le type de jeu de caractères et de règles (ordre, règles de confrontation) que vous utilisez pour les valeurs de chaîne.

Par exemple, dans votre cas, vous utilisez des règles latines avec respect de la casse (CI) et de l’accent sensible (COMME)

Vous pouvez vous référer à ceci Documentation

15
il_guru

Ceci spécifie le classement par défaut pour la base de données. Chaque champ de texte que vous créez dans les tables de la base de données utilisera ce classement, sauf si vous en spécifiez un autre.

Une base de données a toujours un classement par défaut. Si vous n'en spécifiez pas, le classement par défaut de l'instance SQL Server est utilisé.

Le nom du classement que vous utilisez indique qu'il utilise la page de code Latin1, qu'il est insensible à la casse (CI) et sensible à l'accent (AS). Ce classement est utilisé aux États-Unis. Il contient donc des règles de tri utilisées aux États-Unis.

Le classement détermine comment les valeurs de texte sont comparées pour l'égalité et la ressemblance, et comment elles sont comparées lors du tri. La page de code est utilisée lors du stockage de données non-Unicode, par ex. champs varchar.

8
Guffa