On m'a demandé de modifier le classement sur une base de données qui est en production depuis quelques années car elle n'était pas définie correctement au moment du déploiement.
Donc, mes recherches montrent que pour changer le classement sur toutes les colonnes, vous devez supprimer les contraintes et autres, et cela semblait devenir laid rapidement. J'ai donc pensé simplement à écrire tous les objets, à trouver/remplacer toutes les références à l'ancien classement, à créer la nouvelle base de données, puis à utiliser dbatools pour copier les données:
Get-DbaDbTable -SqlInstance SourceServer -Database SourceDb |
foreach-object
{ Copy-DbaDbTableData -DestinationDatabase TargetDb -DestinationTable $_.Name }
Est-ce une approche valable pour changer le classement sur tout? À première vue, cela semble avoir fonctionné de façon plutôt nageuse (c'est-à-dire, a traversé la migration des données sans erreur).
Passer de SQL_Latin1_General_CP1_CI_AS à SQL_Latin1_General_CP437_CI_AI si cela importe.
Eh bien, cela pourrait être très simple, ou cela pourrait avoir beaucoup de complications. Il existe de nombreuses restrictions qui empêcheront de modifier le classement par défaut d'une base de données
Veuillez consulter l'article suivant qui explique en détail ce que chaque niveau de classement affecte, ce que vous pourriez rencontrer et ce que vous devez rechercher, et ce qu'il faut faire à ce sujet:
Votre approche pourrait être parfaitement valable. Si cela semble fonctionner, c'est possible. Passez en revue chacun des points de mon message pour vous assurer que vous avez regardé tous les endroits qui doivent être vérifiés. Par exemple, modifiez-vous simplement le classement d'une seule base de données? Si oui, quel est le classement au niveau de l'instance? C'est l'un des deux que vous avez mentionnés? Il y a pourrait un comportement étrange si les classements au niveau de la base de données et au niveau de l'instance ne correspondent pas, mais pas nécessairement.
Juste par curiosité: pourquoi voulez-vous utiliser SQL_Latin1_General_CP437_CI_AI . On dirait un choix potentiellement étrange. L'application qui utilise cette base de données a-t-elle vraiment besoin de la page de codes 437? Est-ce, par hasard, pour JIRA? Je demande seulement parce que c'est l'un des deux classements "pris en charge" pour JIRA, et ce n'est pas si souvent que quelqu'un veut utiliser ce classement particulier. Si tel est le cas, vous n'avez probablement pas besoin d'effectuer cette modification. Veuillez consulter ma recommandation à Atlassian ici concernant ce problème:
Long ticket de support court: Atlassian a fait à lui-même et à ses clients un énorme mauvais service en proposant en premier lieu des "classements pris en charge". Jusqu'à présent, aucune preuve n'a été fournie pour expliquer pourquoi ces deux ont été choisis et pourquoi d'autres ne sont pas "pris en charge". Je suis sûr à 99,99999% qu'il s'agit simplement d'un problème où leurs développeurs ne comprennent pas les classements (ou les classements SQL Server), ce qui n'est pas contre leurs développeurs car Jira est un peu génial, c'est juste que la plupart des gens ne comprennent pas ce genre de choses. Je leur recommande de soutenir les éléments suivants:
La base de données dans laquelle Jira est installé doit avoir un classement insensible à la casse qui est identique au classement au niveau de l'instance.
que le classement soit insensible à l'accent ou non dépend de vous et de la manière dont vous souhaitez que le tri et les comparaisons soient effectués. À la fin, assurez-vous simplement que l'instance et la base de données ont le même classement. (si vous étiez sur le point de faire tout ce travail uniquement pour changer la base de données en un classement qu'ils "prennent en charge" mais est différent du classement au niveau de l'instance, alors vous auriez cassé Jira en essayant de vous conformer à leur (probablement inutile ) exigence déclarée ;-).
Mon conseil: ne changez rien! Vous avez même dit:
une base de données en production depuis quelques années
S'il est en production depuis des années sans rencontrer de problèmes, il n'y a probablement aucun problème :-)
C'est trop long pour un commentaire, mais je veux souligner le potentiel de perte de données dans les colonnes char/varchar lors du changement de la page de codes. Les données peuvent être mappées à un autre caractère que la page de codes source ou un "?" quand aucun personnage n'existe du tout. Surtout, aucune erreur ne sera signalée lors de la migration en cas de perte de données.
Ce script montre le mappage des caractères non ASCII allant de la page de codes 1252 à 437:
WITH
t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n))
,t1k AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) + 127 AS num FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c)
,CP1252_Characters AS (
SELECT
num AS CodePoint
, CHAR(num) COLLATE SQL_Latin1_General_CP1_CI_AS AS CP1252_Character
FROM t1k
WHERE num < 256
)
SELECT
CP1252_Characters.CodePoint AS CP1252_CodePoint
, CP1252_Characters.CP1252_Character
, CP1252_Characters.CP1252_Character COLLATE SQL_Latin1_General_CP437_CI_AI AS Converted_CP457Character
FROM CP1252_Characters;
Notez l'absence du symbole de l'euro dans la page de codes 437, par exemple. J'espère que vous n'aviez pas de billets Jira contenant ce symbole monétaire :-)
+------------------+------------------+--------------------------+
| CP1252_CodePoint | CP1252_Character | Converted_CP457Character |
+------------------+------------------+--------------------------+
| 128 | € | ? |
| 129 | | ? |
| 130 | ‚ | , |
| 131 | ƒ | ƒ |
| 132 | „ | , |
| 133 | … | . |
| 134 | † | + |
| 135 | ‡ | ╪ |
| 136 | ˆ | ^ |
| 137 | ‰ | % |
| 138 | Š | S |
| 139 | ‹ | < |
| 140 | Œ | O |
| 141 | | ? |
| 142 | Ž | Z |
| 143 | | ? |
| 144 | | ? |
| 145 | ‘ | ` |
| 146 | ’ | ' |
| 147 | “ | " |
| 148 | ” | " |
| 149 | • | |
| 150 | – | - |
| 151 | — | - |
| 152 | ˜ | ~ |
| 153 | ™ | T |
| 154 | š | s |
| 155 | › | > |
| 156 | œ | o |
| 157 | | ? |
| 158 | ž | z |
| 159 | Ÿ | Y |
| 160 | | |
| 161 | ¡ | ¡ |
| 162 | ¢ | ¢ |
| 163 | £ | £ |
| 164 | ¤ | |
| 165 | ¥ | ¥ |
| 166 | ¦ | ▌ |
| 167 | § | |
| 168 | ¨ | " |
| 169 | © | c |
| 170 | ª | ª |
| 171 | « | « |
| 172 | ¬ | ¬ |
| 173 | | - |
| 174 | ® | r |
| 175 | ¯ | _ |
| 176 | ° | ° |
| 177 | ± | ± |
| 178 | ² | ² |
| 179 | ³ | 3 |
| 180 | ´ | ' |
| 181 | µ | µ |
| 182 | ¶ | |
| 183 | · | · |
| 184 | ¸ | , |
| 185 | ¹ | 1 |
| 186 | º | º |
| 187 | » | » |
| 188 | ¼ | ¼ |
| 189 | ½ | ½ |
| 190 | ¾ | _ |
| 191 | ¿ | ¿ |
| 192 | À | A |
| 193 | Á | A |
| 194 | Â | A |
| 195 | Ã | A |
| 196 | Ä | Ä |
| 197 | Å | Å |
| 198 | Æ | Æ |
| 199 | Ç | Ç |
| 200 | È | E |
| 201 | É | É |
| 202 | Ê | E |
| 203 | Ë | E |
| 204 | Ì | I |
| 205 | Í | I |
| 206 | Î | I |
| 207 | Ï | I |
| 208 | Ð | D |
| 209 | Ñ | Ñ |
| 210 | Ò | O |
| 211 | Ó | O |
| 212 | Ô | O |
| 213 | Õ | O |
| 214 | Ö | Ö |
| 215 | × | x |
| 216 | Ø | O |
| 217 | Ù | U |
| 218 | Ú | U |
| 219 | Û | U |
| 220 | Ü | Ü |
| 221 | Ý | Y |
| 222 | Þ | _ |
| 223 | ß | ß |
| 224 | à | à |
| 225 | á | á |
| 226 | â | â |
| 227 | ã | a |
| 228 | ä | ä |
| 229 | å | å |
| 230 | æ | æ |
| 231 | ç | ç |
| 232 | è | è |
| 233 | é | é |
| 234 | ê | ê |
| 235 | ë | ë |
| 236 | ì | ì |
| 237 | í | í |
| 238 | î | î |
| 239 | ï | ï |
| 240 | ð | d |
| 241 | ñ | ñ |
| 242 | ò | ò |
| 243 | ó | ó |
| 244 | ô | ô |
| 245 | õ | o |
| 246 | ö | ö |
| 247 | ÷ | ÷ |
| 248 | ø | o |
| 249 | ù | ù |
| 250 | ú | ú |
| 251 | û | û |
| 252 | ü | ü |
| 253 | ý | y |
| 254 | þ | _ |
| 255 | ÿ | ÿ |
+------------------+------------------+--------------------------+