web-dev-qa-db-fra.com

Codage de caractères par défaut de SQL Server

Par défaut, quel est le codage de caractères défini pour une base de données dans Microsoft SQL Server?

Comment puis-je voir le codage de caractères actuel dans SQL Server?

45
david99world

Si vous devez connaître le classement par défaut pour une base de données nouvellement créée, utilisez:

SELECT SERVERPROPERTY('Collation')

Il s'agit du classement du serveur pour l'instance SQL Server que vous exécutez.

42
ThomasMcLeod

Codages

SQL Server stocke les données Unicode (c'est-à-dire celles qui se trouvent dans les types à préfixe XML et N-) dans UCS-2/UTF-16 (le stockage est identique, UTF-16 ne fait que gérer correctement les caractères supplémentaires). Ce n'est pas configurable: il n'y a pas d'option pour utiliser UTF-8 ou UTF-32. Que les fonctions intégrées puissent ou non gérer correctement les caractères supplémentaires, et que ceux-ci soient ou non triés et comparés correctement, dépend du classement utilisé. Les anciennes collations comparent tous les caractères supplémentaires les uns aux autres. À partir de SQL Server 2005, ils ont introduit la série 90, Classements (ceux avec _90_ dans le nom), qui permettent au moins de faire une comparaison binaire sur les caractères supplémentaires afin de les différencier, même s'ils ne sont pas triés dans l'ordre souhaité. Cela vaut également pour les séries 100 introduites dans SQL Server 2008. SQL Server 2012 introduit les collations avec des noms se terminant par _SC qui trieront non seulement les caractères supplémentaires, mais permettent également aux fonctions intégrées de les interpréter comme prévu (le traitement des paire de substitution en tant qu’entité unique). À partir de SQL Server 2017, tous les nouveaux classements (série 140) prennent implicitement en charge les caractères supplémentaires , de sorte qu'il n'y a pas de nouveaux classements dont les noms se terminent par _SC.

Les données non Unicode (c'est-à-dire celles qui se trouvent dans les types CHAR, VARCHAR et TEXT, mais n'utilisez pas TEXT, utilisez plutôt VARCHAR(MAX)) utilisent un codage à 8 bits (ASCII étendu, DBCS ou EBCDIC). Le jeu de caractères/codage spécifique est basé sur la page de code, elle-même basée sur le classement d'une colonne, ou le classement de la base de données actuelle pour les littéraux et les variables, ou le classement de l'instance pour les noms de variable/curseur et GOTO. labels, ou ce qui est spécifié dans une clause COLLATE, le cas échéant.

Pour voir comment les paramètres régionaux correspondent aux classements, consultez:

Pour afficher la page de code associée à un classement particulier (il s'agit du jeu de caractères et affecte uniquement les données CHARVARCHAR/TEXT), exécutez la commande suivante:

SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'CodePage' ) AS [CodePage];

Pour voir le LCID (locale) associé à un classement particulier (cela affecte les règles de tri et de comparaison), exécutez ce qui suit:

SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'LCID' ) AS [LCID];

Pour afficher la liste des collations disponibles, ainsi que leurs LCID et pages de code associés, exécutez:

SELECT [name],
       COLLATIONPROPERTY( [name], 'LCID' ) AS [LCID],
       COLLATIONPROPERTY( [name], 'CodePage' ) AS [CodePage]
FROM sys.fn_helpcollations()
ORDER BY [name];

Défauts

Avant d'examiner les classements par défaut du serveur et de la base de données, vous devez comprendre l'importance relative de ces valeurs par défaut.

Le classement Serveur (Instance, vraiment) par défaut est utilisé par défaut pour les bases de données nouvellement créées (y compris les bases de données système: master, model, msdb et tempdb). Mais cela ne signifie pas qu’une base de données (autre que les 4 bases de données système) utilise ce classement. Le classement par défaut de la base de données peut être modifié à tout moment. Le classement par défaut du serveur, cependant, n'est pas si facile à changer. Les contrôles de classement serveur/instance:

  • noms de variables locales
  • Noms du CURSEUR
  • GOTO étiquettes

Le classement par défaut de la base de données est utilisé de deux manières:

  • comme valeur par défaut pour les colonnes de chaîne nouvellement créées. Mais cela ne signifie pas que toute colonne de chaîne utilise ce classement. Le classement d'une colonne peut être modifié à tout moment. Ici, connaître la valeur par défaut de la base de données est important car il indique ce que les colonnes de chaîne sont probablement définies.
  • en tant que classement pour les opérations impliquant des littéraux de chaîne, des variables et des fonctions intégrées qui ne prennent pas d'entrées de chaîne, mais produisent une sortie de chaîne (c'est-à-dire IF (@InputParam = 'something')). Ici, connaître le paramètre par défaut de la base de données est décisif, car il régit le comportement de ces opérations.

La colonne Classement est spécifiée dans la clause COLLATE au moment du CREATE TABLE ou d'un ALTER TABLE {table_name} ALTER COLUMN, ou, si elle n'est pas spécifiée, extraite de la valeur par défaut de la base de données.

Puisqu'il existe plusieurs couches dans lesquelles un classement peut être spécifié (Base de données par défaut/colonnes/littéraux et variables), le classement résultant est déterminé par Précision de classement .

Cela dit, la requête suivante affiche les paramètres par défaut/actuels du système d'exploitation, de l'instance SQL Server et de la base de données spécifiée:

SELECT os_language_version,
       ---
       SERVERPROPERTY('LCID') AS 'Instance-LCID',
       SERVERPROPERTY('Collation') AS 'Instance-Collation',
       SERVERPROPERTY('ComparisonStyle') AS 'Instance-ComparisonStyle',
       SERVERPROPERTY('SqlSortOrder') AS 'Instance-SqlSortOrder',
       SERVERPROPERTY('SqlSortOrderName') AS 'Instance-SqlSortOrderName',
       SERVERPROPERTY('SqlCharSet') AS 'Instance-SqlCharSet',
       SERVERPROPERTY('SqlCharSetName') AS 'Instance-SqlCharSetName',
       ---
       DATABASEPROPERTYEX(N'{database_name}', 'LCID') AS 'Database-LCID',
       DATABASEPROPERTYEX(N'{database_name}', 'Collation') AS 'Database-Collation',
   DATABASEPROPERTYEX(N'{database_name}', 'ComparisonStyle') AS 'Database-ComparisonStyle',
       DATABASEPROPERTYEX(N'{database_name}', 'SQLSortOrder') AS 'Database-SQLSortOrder'
FROM   sys.dm_os_windows_info;

_/UPDATE 2018-10-02

Bien que cette option ne soit pas encore viable, SQL Server 2019 introduit la prise en charge native de UTF-8 dans les types de données VARCHAR/CHAR. Il contient actuellement trop de bogues pour pouvoir être utilisé, mais s’ils sont corrigés, il s’agit d’une option pour les scénarios certains. Veuillez vous reporter à l'article " Prise en charge native de UTF-8 dans SQL Server 2019: Sauveur ou faux prophète? " pour une analyse détaillée de cette nouvelle fonctionnalité.

27
Solomon Rutzky

Le codage de caractères par défaut pour une base de données SQL Server est iso_1, ISO 8859-1. Notez que l'encodage des caractères dépend du type de données d'une colonne. Vous pouvez avoir une idée des codages de caractères utilisés pour les colonnes d'une base de données, ainsi que des classements à l'aide de ce code SQL:

select data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name, count(*) count
from information_schema.columns
group by data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name;

Si elle utilise la valeur par défaut, nom_du_caractère devrait être iso_1 pour les types de données char et varchar. Étant donné que nchar et nvarchar stockent les données Unicode au format UCS-2, nom_set_caractère pour ces types de données est UNICODE.

17

SELECT DATABASEPROPERTYEX('DBName', 'Collation') SQLCollation;

Où DBName est le nom de votre base de données.

15
JNK

Je pense que cela mérite une réponse distincte: bien que les données unicode internes soient stockées au format UTF-16 dans Sql Server, il s'agit de la version Little Endian. Par conséquent, si vous appelez la base de données depuis un système externe, vous devez probablement spécifier UTF 16LE.

0