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
Cela fonctionne bien.
Bien que le reste du 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? Aussi, je voudrais savoir si créer la base de données de cette manière est une bonne pratique?
sql-server
database
tsql
collation
Tonnerre
la source
la source
SQL_Latin1_General_CI_AS
. Plus précisément, CP1 m'a fait me demander.SQL_Latin1_General_CI_AS
. Au contraire, il y a unLatin1_General_CI_AS
. VoirSELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');
. Il existe des différences subtiles concernant le tri et la comparaison entre les deux classements. Voir olcot.co.uk/sql-blogs/… .Veuillez noter que la réponse acceptée est un peu incomplète. Oui, au niveau le plus élémentaire, le classement gère le tri. MAIS, les règles de comparaison définies par le classement choisi sont utilisées dans de nombreux endroits en dehors des requêtes utilisateur sur les données utilisateur.
Si "Que fait
COLLATE SQL_Latin1_General_CP1_CI_AS
-on?" signifie "Que fait laCOLLATE
clause deCREATE DATABASE
?", puis:La
COLLATE {collation_name}
clause de l'CREATE DATABASE
instruction spécifie le classement par défaut de la base de données et non du serveur; Les classements par défaut au niveau de la base de données et au niveau du serveur contrôlent des choses différentes.Contrôles au niveau du serveur (c'est-à-dire Instance) :
master
,model
,msdb
ettempdb
.tempdb
, il s'agit alors du classement par défaut pour les colonnes de chaîne dans les tables temporaires (globales et locales), mais pas pour les variables de table.master
, il s'agit alors du classement utilisé pour les données au niveau du serveur , telles que les noms de base de données (c'est-à-dire laname
colonne danssys.databases
), les noms de connexion, etc.GOTO
étiquettesCOLLATE
clause est manquanteContrôles au niveau de la base de données :
CHAR
,VARCHAR
,NCHAR
,NVARCHAR
,TEXT
etNTEXT
- mais ne pas utiliserTEXT
ouNTEXT
) lorsque laCOLLATE
clause est absente de la définition de la colonne. Cela vaut pour les déclarationsCREATE TABLE
etALTER TABLE ... ADD
.'some text'
) et les variables de chaîne (ie@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é.sys.objects
), les noms de colonne (iesys.columns
), les noms d'index (iesys.indexes
), etc.Aussi:
Latin1
ne signifie pas «ASCII» car l'ASCII standard ne couvre que les valeurs 0 à 127 et toutes les pages de codes (qui peuvent être représentées dans SQL Server et mêmeNVARCHAR
) mappent ces 128 mêmes valeurs aux mêmes caractères.Si "Que fait
COLLATE SQL_Latin1_General_CP1_CI_AS
-on?" signifie "Que fait ce classement particulier?", puis:Étant donné que le nom commence par
SQL_
, il s'agit d'un classement SQL Server, pas d'un classement Windows. Ceux-ci sont définitivement obsolètes, même s'ils ne sont pas officiellement obsolètes, et sont principalement destinés à la compatibilité pré-SQL Server 2000. Bien que, malheureusement, ilSQL_Latin1_General_CP1_CI_AS
soit très courant car il s'agit de la valeur par défaut lors de l'installation sur un système d'exploitation utilisant l'anglais américain comme langue. Ces classements doivent être évités dans la mesure du possible.Les classements Windows (ceux dont les noms ne commencent pas par
SQL_
) sont plus récents, plus fonctionnels, ont un tri cohérent entreVARCHAR
etNVARCHAR
pour les mêmes valeurs, et sont mis à jour avec des poids de tri supplémentaires / corrigés et des mappages majuscules / minuscules. Ces classements n'ont pas non plus le problème de performances potentiel que présentent les classements SQL Server: Impact sur les index lors du mélange des types VARCHAR et NVARCHAR .Latin1_General
est la culture / locale.NCHAR
,NVARCHAR
et lesNTEXT
données ce qui détermine les règles linguistiques utilisées pour le tri et la comparaison.CHAR
,VARCHAR
etTEXT
données (colonnes, littéraux et variables) ce qui détermine le:Latin1_General
classements utilisent la page de codes 1252, lesHebrew
classements utilisent la page de codes 1255, etc.CP{code_page}
ou{version}
CP{code_page}
est la page de codes 8 bits qui détermine les caractères mappés aux valeurs 128 à 255. Bien qu'il existe quatre pages de codes pour les jeux de caractères à deux octets (DBCS) qui peuvent utiliser des combinaisons de 2 octets pour créer plus de 256 caractères, ils ne sont pas disponibles pour les classements SQL Server.Pour les classements Windows :, bien
{version}
qu'il ne soit pas présent dans tous les noms de classement, 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 version80
(ce qui signifie SQL Server 2000 car il s'agit de la version 8.0). Toutes les versions de SQL Server ne sont pas livrées avec de nouveaux classements, il y a donc des lacunes dans les numéros de version. Il y en a qui le sont90
(pour SQL Server 2005, qui est la version 9.0), la plupart le sont100
(pour SQL Server 2008, version 10.0) et un petit ensemble a140
(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, elles ont simplement ajouté la prise en charge de caractères supplémentaires pour les fonctions intégrées. Ainsi, ces fins existent pour la version90
et les100
classements, mais uniquement à partir de SQL Server 2012.CS
= sensible à la casse ouCI
= insensible à la casseAS
= sensible à l'AI
accent ou = insensible à l'accentKS
= Kana sensible au type ou manquant = Kana insensible au typeWS
= sensible à la largeur ou manquant = insensible à la largeurVSS
= sélecteur de variation sensible (uniquement disponible dans les classements version 140) ou manquant = sélecteur de variation insensibleDernière pièce optionnelle:
_SC
à la fin signifie "Prise en charge des caractères supplémentaires". Le "support" affecte uniquement la façon dont les fonctions intégrées interprètent les paires de substitution (qui sont la façon dont 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 voient à la place deux points de code dénués de sens qui composent la paire de substitution. Cette fin peut être ajoutée à n'importe quel classement non binaire, version 90 ou 100._BIN
ou_BIN2
à la fin signifie le tri et la comparaison «binaires». 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 le style_BIN2
le plus récent et le plus précis. Si vous utilisez SQL Server 2005 ou plus récent, utilisez_BIN2
. Pour plus de détails sur les différences entre_BIN
et_BIN2
, veuillez consulter: Différences entre les divers classements binaires (cultures, versions et BIN vs BIN2) ._UTF8
est une nouvelle option à partir de SQL Server 2019. Il s'agit d'un codage 8 bits qui permet de stocker les données Unicode dansVARCHAR
et lesCHAR
types de données (mais pas leTEXT
type de données obsolète ). Cette option ne peut être utilisée que sur les classements qui prennent en charge les caractères supplémentaires (c'est-à-dire les classements de la version 90 ou 100 avec_SC
dans leur nom et les classements de la version 140). Il existe également un seul_UTF8
classement binaire (_BIN2
, non_BIN
).VEUILLEZ NOTER: UTF-8 a été conçu / créé pour être compatible avec les environnements / codes configurés pour les encodages 8 bits tout en souhaitant prendre en charge Unicode. Même s'il existe quelques scénarios dans lesquels UTF-8 peut fournir jusqu'à 50% d'économie d'espace par rapport à
NVARCHAR
, c'est un effet secondaire et cela a un coût d'un léger impact sur les performances dans de nombreuses / la plupart des opérations. Si vous en avez besoin pour la 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 bien plus que quelques lignes de données. Soyez averti que les classements UTF-8 fonctionnent mieux lorsque TOUTES les colonnes, et la base de données elle-même, utilisent desVARCHAR
données (colonnes, variables, littéraux de chaîne) avec un_UTF8
collation. C'est l'état naturel pour quiconque l'utilise pour la compatibilité, mais pas pour ceux qui espèrent l'utiliser pour économiser de l'espace. Soyez prudent lorsque vous mélangez des données VARCHAR à l'aide d'un_UTF8
classement avec desVARCHAR
données utilisant des non-_UTF8
collations ou desNVARCHAR
données, car vous pourriez rencontrer un comportement étrange / une perte de données. Pour plus de détails sur les nouveaux classements UTF-8, veuillez consulter: Prise en charge native d'UTF-8 dans SQL Server 2019: Savior ou False Prophet?la source
COLLATE
faisait l' article deCREATE DATABASE
. Vous avez dit l'une des nombreuses choses qu'il fait. Pourquoi pensez-vous que le PO ne veut connaître que 10% de la réponse? Si toutes les informations sont présentées, chaque personne peut décider de la quantité à prendre. Mais si seulement quelques informations sont données, le choix a été fait pour eux. Je choisis de fournir autant d'informations que possible car la plupart d'entre elles ne sont pas bien connues. (suite)Le CP1 signifie 'Code Page 1' - techniquement cela se traduit par la page de code 1252
la source
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 insensible à la casse ( CI ) et sensible à l'accent ( AS )
Vous pouvez vous référer à cette documentation
la source
Cela spécifie le classement par défaut de 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 différent.
Une base de données a toujours un classement par défaut. Si vous n'en spécifiez aucun, 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 codes Latin1 1, qu'il est insensible à la casse (CI) et aux accents (AS). Ce classement est utilisé aux États-Unis, il contiendra donc les règles de tri utilisées aux États-Unis.
Le classement décide 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 codes est utilisée lors du stockage de données non-Unicode, par exemple des champs varchar.
la source
not
spécifier de classement, bien que vous puissiez accepter la valeur par défaut) faux (il est également utilisé pour les données Unicode)Latin1_General_CI_AS
. Maintenant, je l'ai mal lu car je m'attendais à moitié à ce que la déclaration concerne le classement SERVER, ce qui nécessite l'acceptation de la valeur par défaut dans l'interface utilisateur. Pour le 2ème point, vous semblez impliquer que le classement n'est pas utilisé pour trier les données Unicode (même si vous passez desorting
àstoring
dans les 2 dernières phrases). Les données texte Unicode obéissent également aux classements.