sql-server - ejemplos - sql server select encoding
Codificación de caracteres por defecto de SQL Server (5)
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?
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 los caracteres suplementarios correctamente). Esto no es configurable: no hay ninguna opción para usar UTF-8 o UTF-32. El hecho de que las funciones integradas puedan o no manejar adecuadamente los Caracteres Suplementarios, y si éstas se clasifican y se comparan adecuadamente, depende de la intercalación que se utilice. Las colaciones anteriores equiparan a todos los personajes 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 de los caracteres suplementarios para poder diferenciarlos, incluso si no ordenaron en el orden deseado. Esto también se aplica a las colaciones de la serie 100
introducidas en SQL Server 2008. SQL Server 2012 introdujo colaciones 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, el tratamiento de par suplente como una sola entidad). A partir de SQL Server 2017, todas las nuevas colaciones (la serie 140
) admiten de manera implícita los caracteres suplementarios , por lo que no hay nuevas colas con nombres que terminen en _SC
.
Los datos que no son Unicode (es decir, los que se encuentran en los tipos CHAR
, VARCHAR
y TEXT
, pero no usan TEXT
, en su lugar usan VARCHAR(MAX)
) usan una codificación de 8 bits (ASCII extendido, DBCS o EBCDIC). El conjunto de caracteres / codificación específicos se basa en la página de códigos, que a su vez se basa en la intercalación de una columna, la intercalación de la base de datos actual para literales y variables, o la intercalación de la instancia para los nombres de variables / cursores y GOTO
etiquetas, 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 intercalación particular (este es el conjunto de caracteres y solo afecta a los datos CHAR
/ VARCHAR
/ TEXT
), ejecute lo siguiente:
SELECT COLLATIONPROPERTY( ''Latin1_General_100_CI_AS'' , ''CodePage'' ) AS [CodePage];
Para ver el LCID (es decir, la configuración regional) asociado con una intercalación particular (esto afecta 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 colaciones 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 mirar las colaciones predeterminadas del servidor y la base de datos, se debe entender la importancia relativa de esos valores predeterminados.
La intercalación predeterminada del Servidor (realmente, instancia) se usa como la predeterminada para las Bases de datos creadas recientemente (incluidas las Bases de datos del sistema: master
, model
, msdb
y tempdb
). Pero esto no significa que cualquier base de datos (aparte de los 4 DB del sistema) esté utilizando esa intercalación. La base de datos por defecto de la base de datos se puede cambiar en cualquier momento. Sin embargo, la intercalación predeterminada del servidor no es tan fácil de cambiar. Los controles del servidor / intercalación de instancias:
- nombres de variables locales
- Nombres de CURSOR
- Etiquetas de goto
La intercalación predeterminada de la base de datos se utiliza de dos maneras:
- como el valor predeterminado para las columnas de cadena recién creadas. Pero esto no significa que ninguna columna de cadena esté usando esa intercalación. La intercalación de una columna se puede cambiar en cualquier momento. En este caso, conocer el valor predeterminado de la base de datos es importante como una indicación de qué es lo más probable que se establezcan las columnas de cadena.
- como la Clasificación para operaciones que involucran literales de cadena, variables y funciones incorporadas que no toman entradas de cadena pero producen una salida de cadena (es decir,
IF (@InputParam = ''something'')
). En este caso, conocer el valor predeterminado de la base de datos es definitivamente importante ya que rige el comportamiento de estas operaciones.
La columna Collation se especifica en la cláusula COLLATE
en el momento de CREATE TABLE
o en ALTER TABLE {table_name} ALTER COLUMN
, o si no se especifica, tomada de la base de datos por defecto.
Como aquí hay varias capas donde se puede especificar una intercalación (Base de datos predeterminada / columnas / literales y variables), la intercalación resultante está determinada por la precedencia de la 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;
ACTUALIZACIÓN 2018-10-02
Si bien esta opción aún no es viable, SQL Server 2019 introduce soporte nativo para UTF-8 en los tipos de datos VARCHAR
/ CHAR
. Actualmente hay demasiados errores para usarlo, pero si se solucionan, esta es una opción para algunos escenarios. Para obtener un análisis detallado de esta nueva característica, consulte mi publicación, " Compatibilidad con UTF-8 nativo en SQL Server 2019: ¿Salvador o falso profeta? ".
Creo que esto merece una respuesta por separado: aunque los datos internamente Unicode se almacenan como UTF-16 en el servidor Sql, este es el sabor de Little Endian, por lo que si llama a la base de datos desde un sistema externo, probablemente deba especificar UTF- 16LE.
La codificación de caracteres predeterminada para una base de datos de 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 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 utiliza el valor predeterminado, el nombre_conjunto de caracteres debe ser iso_1 para los tipos de datos char y varchar. Dado que nchar y nvarchar almacenan datos Unicode en formato UCS-2, el nombre_conjunto de caracteres para esos tipos de datos es UNICODE.
Si necesita saber la intercalación predeterminada para un uso de base de datos recién creado:
SELECT SERVERPROPERTY(''Collation'')
Esta es la intercalación del servidor para la instancia de SQL Server que está ejecutando.
SELECT DATABASEPROPERTYEX(''DBName'', ''Collation'') SQLCollation;
Donde DBName es el nombre de su base de datos.