Codificación de caracteres predeterminada de SQL Server


De forma predeterminada: ¿cuál es el conjunto de codificación de caracteres para una base de datos en Microsoft SQL Server?

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

Author: Solomon Rutzky, 2011-03-03

5 answers

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.

 35
Author: ThomasMcLeod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-21 03:58:37

Codificaciones

SQL Server almacena datos Unicode (es decir, los que se encuentran en los tipos con prefijo XML y N) en UCS-2 / UTF-16 (el almacenamiento es el mismo, UTF-16 simplemente maneja Caracteres Suplementarios correctamente). Esto no es configurable: no hay opción para usar UTF-8 o UTF-32. Si las funciones integradas pueden manejar correctamente Caracteres Suplementarios, y si se ordenan y comparan correctamente, depende de la Intercalación que se esté utilizando. Anciano Las intercalaciones equiparan todos los Caracteres Suplementarios entre sí. A partir de SQL Server 2005 introdujeron las Colaciones de series 90 (aquellas con _90_ en el nombre) que al menos podían hacer una comparación binaria en Caracteres Suplementarios para que pudiera diferenciarse entre ellos, incluso si no se ordenaban en el orden deseado. Esto también es válido para las intercalaciones de series 100 introducidas en SQL Server 2008. SQL Server 2012 introdujo Colaciones con nombres que terminan en _SC que no solo ordenan Caracteres suplementarios correctamente, pero también permiten a las funciones integradas interpretarlos como se espera (es decir, tratar al par sustituto como una sola entidad). A partir de SQL Server 2017, todas las nuevas Colaciones (la serie 140) soportan implícitamente Caracteres Suplementarios, por lo tanto no hay nuevas Colaciones con nombres que terminen en _SC.

Datos no Unicode (es decir, los que se encuentran en el CHAR, VARCHAR, and TEXT types-but don't use TEXT, use VARCHAR(MAX) instead) uses an 8-bit codificación (ASCII extendida, DBCS o EBCDIC). El conjunto / codificación 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 variables / cursor y etiquetas GOTO, o lo que se especifica en una cláusula COLLATE si se está utilizando una.

Para ver cómo los locales coinciden con las colaciones, echa un vistazo a:

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

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

Para ver el LCID (es decir, la configuración regional) asociado a una intercalación en 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 asociados Lcid y el Código Pages, run:

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

Valores predeterminados

Antes de mirar las Intercalaciones predeterminadas del Servidor y de la Base de datos, uno debe entender la importancia relativa de esos valores predeterminados.

La Intercalación predeterminada del servidor (Instancia, realmente) se usa como 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 cualquier Base de datos (que no sea el sistema 4 DBs) está utilizando esa Intercalación. La Intercalación predeterminada de la base de datos puede ser cambiado en cualquier momento. La intercalación predeterminada del servidor, sin embargo, no es tan fácil de cambiar. Los controles de Intercalación de servidor/Instancia:

  • nombres de variables locales
  • Nombres de cursor
  • Ir a etiquetas

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

  • como el valor predeterminado para las columnas de cadena recién creadas. Pero esto no significa que cualquier columna de cadena esté usando esa intercalación. La intercalación de una columna se puede cambiar en cualquier momento. Aquí conociendo la El valor predeterminado de la base de datos es importante como una indicación de lo que es más probable que se establezcan las columnas de cadena.
  • como la Intercalación para operaciones que involucran literales de cadena, variables y funciones integradas que no toman entradas de cadena pero 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 gobierna cómo se comportarán estas operaciones.

La colación de columnas se especifica en la cláusula COLLATE en el momento de la CREATE TABLE o una ALTER TABLE {table_name} ALTER COLUMN, o si no se especifica, tomado de la Base de datos por defecto.

Dado que hay varias capas aquí donde se puede especificar una intercalación (Base de datos por defecto / columnas / literales y variables), la Intercalación resultante está determinada por Precedencia de Intercalación.

Dicho todo esto, la siguiente consulta muestra la configuración predeterminada / actual para el sistema operativo, la instancia de SQL Server 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;

ACTUALIZAR 2018-10-02

Aunque esta opción aún no es viable, SQL Server 2019 introduce soporte nativo para UTF-8 en VARCHAR / CHAR tipos de datos. Actualmente hay demasiados errores con ella para que se utiliza, pero si se fija, entonces esta es una opción para algo escenarios. Por favor vea mi post, " Soporte nativo de UTF-8 en SQL Server 2019: ¿Salvador o Falso Profeta?", para un análisis detallado de esta nueva característica.

 23
Author: Solomon Rutzky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-02 15:54:21

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

Donde DBName es el nombre de su base de datos.

 15
Author: JNK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-03 14:54:09

La codificación de caracteres predeterminada para una base de datos SQL Server es iso_1, que es ISO 8859-1. Tenga en cuenta que la codificación de caracteres depende del tipo de datos de una columna. Puede tener una idea de qué codificaciones de caracteres se utilizan para las columnas en una base de datos, así como las intercalaciones utilizando 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 está usando el valor predeterminado, el nombre_caracter_set_name debería ser iso_1 para los tipos de datos char y varchar. Desde nchar y nvarchar almacenar datos Unicode en formato UCS-2, el character_set_name para esos tipos de datos es UNICODE.

 15
Author: Rob at TVSeries.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-09 23:28:29

Creo que esto es digno de una respuesta separada: aunque internamente los datos unicode se almacenan como UTF-16 en Sql Server, este es el sabor Little Endian, por lo que si está llamando a la base de datos desde un sistema externo, probablemente necesite especificar UTF-16LE.

 0
Author: Integrating Stuff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-01 10:28:27