Codificación de caracteres por defecto de SQL Server

Por defecto: ¿cuál es la encoding de caracteres establecida para una base de datos en Microsoft SQL Server?

¿Cómo puedo ver la encoding de caracteres actual en SQL Server?

Si necesita conocer la intercalación predeterminada para una base de datos recién creada, use:

SELECT SERVERPROPERTY('Collation')

Esta es la intercalación del servidor para la instancia de SQL Server que está ejecutando.

Codificaciones

SQL Server almacena datos Unicode (es decir, los que se encuentran en los tipos XML y Nprefijados) en UCS-2 / UTF-16 (el almacenamiento es el mismo, UTF-16 simplemente maneja los caracteres suplementarios correctamente). Esto no es configurable: no hay opción para usar UTF-8 o UTF-32. Si las funciones incorporadas pueden manejar adecuadamente caracteres suplementarios, y si estos se ordenan y se comparan correctamente, depende de la intercalación que se utilice. Las colaciones más antiguas igualan a todos los caracteres suplementarios entre sí. A partir de SQL Server 2005 introdujeron las _90_ de la serie 90 (aquellas con _90_ en el nombre) que al menos podrían hacer una comparación binaria en caracteres suplementarios para poder diferenciarlos, incluso si no ordenaban en el orden deseado. Eso también es válido para las Collations de la serie 100 introducidas en SQL Server 2008. SQL Server 2012 introdujo Collations con nombres que terminan en _SC que no solo clasifican los caracteres suplementarios correctamente, sino que también permiten que las funciones incorporadas los interpreten como se espera (es decir, tratar el par sustituto como una sola entidad). A partir de SQL Server 2017, todas las nuevas intercalaciones (la serie 140 ) admiten implícitamente caracteres suplementarios , por lo tanto, no hay nuevas intercalaciones con nombres que terminen en _SC .

Los datos no Unicode (es decir, los que se encuentran en los tipos CHAR , VARCHAR y TEXT , pero no usan TEXT , usan VARCHAR(MAX) lugar) usan una encoding de 8 bits (Extended ASCII, DBCS o EBCDIC). El juego / encoding de caracteres específicos se basa en la Página de códigos, que a su vez se basa en la intercalación de una columna, o la intercalación de la base de datos actual para literales y variables, o la intercalación de la instancia para nombres de variable / cursor y GOTO tags, o lo que se especifica en una cláusula COLLATE si se está utilizando una.

Para ver cómo las configuraciones locales coinciden con las intercalaciones, mira:

  • Nombre de intercalación de Windows
  • Nombre de intercalación de SQL Server

Para ver la página de códigos asociada a una intercalación particular (este es el conjunto de caracteres y solo afecta los datos de CHAR / VARCHAR / TEXT ), ejecute lo siguiente:

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

Para ver el LCID (es decir, configuración regional) asociado a una intercalación particular (esto afecta a las reglas de clasificación y comparación), ejecute lo siguiente:

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

Para ver la lista de intercalaciones disponibles, junto con sus LCID y páginas de códigos asociadas, ejecute:

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

Valores predeterminados

Antes de observar las intercalaciones predeterminadas del servidor y la base de datos, uno debe comprender la importancia relativa de esos valores predeterminados.

La intercalación predeterminada del servidor (instancia, realmente) se utiliza como la predeterminada para las bases de datos recién creadas (incluidas las bases de datos del sistema: master , model , msdb y tempdb ). Pero esto no significa que ninguna Base de datos (aparte de las 4 bases de datos del sistema) esté utilizando esa intercalación. La clasificación predeterminada de la base de datos se puede cambiar en cualquier momento. La intercalación predeterminada del servidor, sin embargo, no es tan fácil de cambiar. El servidor / controles de intercalación de instancias:

  • nombres de variables locales
  • CURSOR nombres
  • Etiquetas GOTO

La intercalación predeterminada de la base de datos se usa de dos maneras:

  • como el predeterminado para las columnas de cadenas recién creadas. Pero esto no significa que ninguna columna de cadena esté utilizando esa intercalación. La intercalación de una columna se puede cambiar en cualquier momento. Aquí, conocer el valor predeterminado de la Base de datos es importante como una indicación de lo que las columnas de cadena probablemente estén configuradas.
  • como la intercalación para operaciones que involucran literales de cadena, variables y funciones incorporadas que no toman entradas de cadena sino que producen una salida de cadena (es decir, IF (@InputParam = 'something') ). Aquí conocer el valor predeterminado de la base de datos es definitivamente importante ya que rige cómo se comportarán estas operaciones.

La Collation de columna se especifica en la cláusula COLLATE en el momento de CREATE TABLE o ALTER TABLE {table_name} ALTER COLUMN , o si no se especifica, tomada de la base de datos predeterminada.

Dado que hay varias capas aquí donde se puede especificar una intercalación (Database default / columns / literals & variables), la intercalación resultante se determina por colación Precedence .

Dicho todo esto, la siguiente consulta muestra la configuración predeterminada / actual para el sistema operativo, la instancia del servidor SQL y la base de datos especificada:

 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; 

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

Donde DBName es su nombre de base de datos.

La encoding de caracteres predeterminada para una base de datos de SQL Server es iso_1, que es ISO 8859-1. Tenga en cuenta que la encoding de caracteres depende del tipo de datos de una columna. Puede hacerse una idea de qué codificaciones de caracteres se utilizan para las columnas en una base de datos, así como las intercalaciones que utilizan este 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 usa el valor predeterminado, el nombre_conjunto_caracteres debe ser iso_1 para los tipos de datos char y varchar. Como nchar y nvarchar almacenan datos Unicode en formato UCS-2, el nombre_conjunto_caracteres para esos tipos de datos es UNICODE.

Creo que esto es digno de una respuesta por separado: aunque los datos Unicode internos se almacenan como UTF-16 en el servidor Sql, este es el sabor Little Endian, por lo que si llamas a la base de datos desde un sistema externo, probablemente necesites especificar UTF- 16LE.

    Intereting Posts