Nous passons de SQL 2005 [Instance et DB ont un classement de SQL_Latin1_General_CP1_CI_AS
] à SQL 2008 [qui par défaut est Latin1_General_CI_AS
].
J'ai terminé une installation de SQL 2008 R2 et utilisé le Latin1_General_CI_AS
classement par défaut , la restauration de la base de données étant toujours en cours SQL_Latin1_General_CP1_CI_AS
. Les problèmes exceptés se sont produits - les tables #temp où se trouvait Latin1_General_CI_AS
le db SQL_Latin1_General_CP1_CI_AS
et c'est là que je suis maintenant - j'ai besoin de conseils sur les pièges maintenant s'il vous plaît.
Lors de l' installation de SQL Server 2008 R2, j'ai l'option lors de l' installation à l' utilisation 'SQL Collation, used for backwards compatibility'
où j'ai la possibilité de sélectionner le même classement que la base de données 2005: SQL_Latin1_General_CP1_CI_AS
.
Cela me permettra de ne pas avoir de problèmes avec les tables #temp, mais y a-t-il des pièges?
Aurais-je perdu des fonctionnalités ou des fonctionnalités de toute nature en n'utilisant pas un classement «actuel» de SQL 2008?
- Qu'en est-il lorsque nous passons (par exemple dans 2 ans) de 2008 à SQL 2012? Vais-je avoir des problèmes alors?
Serais-je obligé à un moment donné d'aller à
Latin1_General_CI_AS
?J'ai lu que certains scripts DBA complètent les lignes de bases de données complètes, puis exécutez le script d'insertion dans la base de données avec le nouveau classement - j'ai très peur et méfiez-vous de cela - recommanderiez-vous de faire cela?
la source
Réponses:
Tout d'abord, des excuses pour une réponse aussi longue, car je pense qu'il y a toujours beaucoup de confusion lorsque les gens parlent de termes tels que le classement, l'ordre de tri, la page de code, etc.
De BOL :
Cela signifie que le classement est très important car il spécifie des règles sur la façon dont les chaînes de caractères des données sont triées et comparées.
Remarque: Plus d'informations sur COLLATIONPROPERTY
Maintenant, comprenons d'abord les différences ......
Sous T-SQL:
Les résultats seraient:
En regardant les résultats ci-dessus, la seule différence est l'ordre de tri entre les 2 classements, mais ce n'est pas vrai, ce que vous pouvez voir comme ci-dessous:
Test 1:
Résultats du test 1:
D'après les résultats ci-dessus, nous pouvons voir que nous ne pouvons pas comparer directement les valeurs sur des colonnes avec des classements différents, vous devez utiliser
COLLATE
pour comparer les valeurs des colonnes.TEST 2:
La principale différence est la performance, comme le souligne Erland Sommarskog lors de cette discussion sur msdn .
--- Créer des index sur les deux tables
--- Exécutez les requêtes
--- Cela aura une conversion IMPLICITE
--- Exécutez les requêtes
--- Cela n'aura PAS de conversion IMPLICITE
La raison de la conversion implicite est parce que j'ai mon classement de base de données et de serveur au fur
SQL_Latin1_General_CP1_CI_AS
et à mesure que la table Table_Latin1_General_CI_AS a des commentaires de colonne définis commeVARCHAR(50)
avec COLLATE Latin1_General_CI_AS , donc pendant la recherche, SQL Server doit effectuer une conversion IMPLICIT.Test 3:
Avec la même configuration, nous allons maintenant comparer les colonnes varchar avec les valeurs nvarchar pour voir les changements dans les plans d'exécution.
- exécuter la requête
- exécuter la requête
Notez que la première requête peut effectuer une recherche d'index mais doit effectuer une conversion implicite tandis que la seconde effectue une analyse d'index qui s'avère inefficace en termes de performances lorsqu'elle analysera de grandes tables.
Conclusion :
SQL_Latin1_General_CP1_CI_AS
est un classement SQL avec les règles qui vous permettent de trier les données pour unicode et non-unicode sont différentes.Latin1_General_CI_AS
est un classement Windows avec les règles qui vous permettent de trier les données pour unicode et non-unicode sont les mêmes.Voir ma réponse ci-dessus.
Tout dépend des fonctionnalités / fonctionnalités auxquelles vous faites référence. Le classement consiste à stocker et à trier des données.
Je ne peux pas me porter garant! Comme les choses pourraient changer et qu'il est toujours bon d'être en accord avec la suggestion de Microsoft +, vous devez comprendre vos données et les pièges que j'ai mentionnés ci-dessus. Référez-vous également à ceci et à ces éléments de connexion.
Lorsque vous souhaitez modifier le classement, ces scripts sont utiles. Je me suis retrouvé à changer le classement des bases de données pour correspondre au classement du serveur plusieurs fois et j'ai quelques scripts qui le font assez bien. Faites-moi savoir si vous en avez besoin.
Les références :
la source
En plus de ce que @Kin a détaillé dans sa réponse , il y a quelques autres choses à savoir lors du changement du classement par défaut du serveur (c'est-à-dire de l'instance) (les éléments au-dessus de la ligne horizontale sont directement pertinents pour les deux classements mentionnés dans la question; les éléments sous la ligne horizontale sont pertinentes pour le général):
SI LA COLLATION PAR DÉFAUT DE VOTRE BASE DE DONNÉES NE CHANGE PAS , le problème de performances de "conversion implicite" décrit dans la réponse de @ Kin ne devrait pas être un problème car les littéraux de chaîne et les variables locales utilisent le classement par défaut de la base de données, pas celui du serveur. Les seuls impacts pour le scénario dans lequel le classement au niveau de l'instance est modifié mais pas le classement au niveau de la base de données sont (tous deux décrits en détail ci-dessous):
Une différence entre ces deux classements réside dans la façon dont ils trient certains caractères pour les
VARCHAR
données (cela n'affecte pas lesNVARCHAR
données). LesSQL_
classements non EBCDIC utilisent ce qu'on appelle le "tri par chaîne" pour lesVARCHAR
données, tandis que tous les autres classements, et même lesNVARCHAR
données pour lesSQL_
classements non EBCDIC , utilisent ce que l'on appelle le "tri par mots". La différence est que dans "Tri Word", le tiret-
et l'apostrophe'
(et peut-être quelques autres caractères?) Reçoivent un poids très faible et sont essentiellement ignorés sauf s'il n'y a pas d'autres différences dans les chaînes. Pour voir ce comportement en action, exécutez ce qui suit:Retour:
et:
Alors que vous "perdrez" le comportement "Tri de chaînes", je ne suis pas sûr d'appeler cela une "fonctionnalité". C'est un comportement qui a été jugé indésirable (comme en témoigne le fait qu'il n'a été présenté dans aucun des classements Windows). Cependant, il s'agit d' une nette différence de comportement entre les deux classements (là encore, uniquement pour les
VARCHAR
données non EBCDIC ), et vous pouvez avoir du code et / ou des attentes des clients en fonction du comportement "String Sort". Cela nécessite de tester votre code et éventuellement de rechercher pour voir si ce changement de comportement pourrait avoir un impact négatif sur les utilisateurs.Une autre différence entre
SQL_Latin1_General_CP1_CI_AS
etLatin1_General_100_CI_AS
est la possibilité de faire des extensions sur lesVARCHAR
données (lesNVARCHAR
données peuvent déjà les faire pour la plupart desSQL_
classements), comme la manipulationæ
comme si c'était le casae
:Retour:
La seule chose que vous "perdez" ici n'est pas en mesure de faire ces extensions. De manière générale, il s'agit d'un autre avantage du passage à un classement Windows. Cependant, tout comme avec le déplacement "String Sort" vers "Word Sort", la même prudence s'applique: il s'agit d'une nette différence de comportement entre les deux classements (là encore, juste pour les
VARCHAR
données), et vous pouvez avoir du code et / ou un client attentes basées sur l' absence de ces mappages. Cela nécessite de tester votre code et éventuellement de rechercher pour voir si ce changement de comportement pourrait avoir un impact négatif sur les utilisateurs.(noté pour la première fois dans cette réponse SO par @Zarepheth: SQL Server SQL_Latin1_General_CP1_CI_AS peut-il être converti en toute sécurité en Latin1_General_CI_AS? )
Le classement au niveau du serveur est utilisé pour définir le classement des bases de données système, qui comprend
[model]
. La[model]
base de données est utilisée comme modèle pour créer de nouvelles bases de données, ce qui inclut[tempdb]
à chaque démarrage du serveur. Mais, même avec un changement de classement au niveau du serveur qui change le classement de[tempdb]
, il existe un moyen assez simple de corriger les différences de classement entre la base de données qui est "actuelle" lorsqu'elleCREATE #TempTable
est exécutée et[tempdb]
. Lors de la création de tables temporaires, déclarez un classement à l'aide de laCOLLATE
clause et spécifiez un classement deDATABASE_DEFAULT
:Il est préférable d'utiliser la version la plus récente du classement souhaité, si plusieurs versions sont disponibles. À partir de SQL Server 2005, une série de classements «90» a été introduite et SQL Server 2008 a introduit une série de classements «100». Vous pouvez trouver ces classements à l'aide des requêtes suivantes:
Étant donné que vous utilisez SQL Server 2008 R2, vous devez utiliser à la
Latin1_General_100_CI_AS
place deLatin1_General_CI_AS
.Une différence entre les versions sensibles à la casse de ces classements particuliers (c'est-à
SQL_Latin1_General_CP1_CS_AS
- dire etLatin1_General_100_CS_AS
) est dans l'ordre des lettres majuscules et minuscules lors du tri sensible à la casse. Cela affecte également les plages de classes à un caractère (c'est-à-dire[start-end]
) qui peuvent être utilisées avec l'LIKE
opérateur et laPATINDEX
fonction. Les trois requêtes suivantes montrent cet effet pour le tri et la plage de caractères:La seule façon d'obtenir le tri en majuscules avant les minuscules (pour la même lettre) consiste à utiliser l'un des 31 classements prenant en charge ce comportement, qui sont les
Hungarian_Technical_*
classements et une poignée deSQL_
classements (qui ne prennent en charge ce comportement que pour lesVARCHAR
données ).Moins important pour ce changement particulier, mais toujours bon à savoir car cela aurait un impact si vous changez le serveur en un classement binaire ou sensible à la casse, c'est que le classement au niveau du serveur affecte également:
sysname
type de donnéesCe qui signifie que si vous ou "le programmeur qui est parti récemment" qui est apparemment responsable de tout mauvais code ;-) ne faisaient pas attention à la casse et déclaraient une variable comme
@SomethingID
mais y faisaient référence plus@somethingId
tard, cela se briserait si vous passez à un cas -classement sensible ou binaire. De même, le code qui utilise lesysname
type de données mais y fait référence sous le nom deSYSNAME
,SysName
ou autre chose que tout en minuscules se cassera également s'il est déplacé vers une instance à l'aide d'un classement sensible à la casse ou binaire.la source