Mostrando las entradas con la etiqueta Collation. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Collation. Mostrar todas las entradas

miércoles, 3 de febrero de 2021

SQL Server Propiedades de Base de Datos – Opciones 4

Introducción

Ya se ha indicado previamente sobre las propiedades de las bases de datos y he indicado las paginas General, Archivos, Grupos de Archivos y las primeras tres partes de la pagina Opciones, en previas entregas, ahora continuare con la última parte de las opciones de configuración de las bases de datos. 

Página Opciones

Ya se ha indicado previamente que es posible utilizar esta página para ver o modificar varias opciones de configuración para la base de datos seleccionada. Se han establecido las categorías de opciones:

Automático

Contención

Cursor

Configuraciones del ámbito de la base de datos

FILESTREAM

Varios

En esta ocasión se hablará de las opciones restantes. Sin embargo, es necesario tener en cuenta que puede usar las declaraciones de Transact-SQL ALTER DATABASE SET OPTIONS para modificar los valores si así se prefiere.

Recuperación

Esta categoría esta relacionada con la forma en que se lleva a cabo la recuperación de la base de datos en disco.

Verificar página – Aquí se indica la opción que se utiliza para descubrir y notificar transacciones incompletas de E / S causadas por errores de lectura / escritura de disco. Los valores permitidos son None (no se lleva a cabo alguna verificación), TornPageDetection ( se llevan a cabo las siguientes acciones, al escribir una página en disco, se toman los primeros 2 bits de cada sector de 512 bytes en cada página y se almacenan en el encabezado de la página, posteriormente, cuando la página se lee desde el disco, Microsoft SQL Server compara los bits del encabezado con los bits del sector, para asegurarse de que sigan siendo los mismos) y Checksum (al realizar la escritura en disco se crea un valor de suma de comprobación utilizando el contenido de toda la página y guarda ese valor en el encabezado, cuando se lleva a cabo la lectura de una página del disco, se crea de nuevo una suma de comprobación y se compara con la suma de comprobación guardada). Cabe mencionar que el valor recomendado por Microsoft es Checksum.

Tiempo de recuperación objetivo (segundos) – Presenta el valor del límite máximo de tiempo, expresado en segundos, para recuperar la base de datos especificada en caso de un bloqueo. 

Agente de servicio

Esta categoría aplica como se funciona el agente de servicio 

Agente habilitado – Indica si el agente de servicio se encuentra habilitado.

Prioridad de Honor del Servicio – Muestra el valor de Propiedad de Service Broker de solo lectura.

Identificador de corredor de servicios – Muestra el valor del identificador, este valor es de lectura.

Estado

Esta categoría muestra las opciones del estado operativo de la base de datos.

Base de datos de solo lectura - Indica si la base de datos es de solo lectura. Cuando es verdadero, los usuarios solo pueden leer datos en la base de datos, pero no pueden modificar los datos ni los objetos de la base de datos. Es importante indicar que la base de datos se puede eliminarse utilizando DROP DATABASE. 

Estado de la base de datos – Muestra el estado actual de la base de datos. Este valor no es editable. Por lo general, una base de datos mantiene el valor NORMAL, en caso de que este estado se presente con algún valor diferente deberá indagarse que ha pasado con la base de datos.

Cifrado habilitado – Muestra si la base de datos está habilitada para el cifrado de datos. Es necesario contar con una clave de cifrado. 

Acceso restringido - Muestra que usuarios pueden acceder a la base de datos. Los posibles valores son:  Múltiple ( con el estado normal de producción permite que varios usuarios accedan a la base de datos),  Único (usado principalmente para acciones de mantenimiento, solo un usuario puede acceder a la base de datos),  Restringido (solo los miembros de los roles db_owner, dbcreator o sysadmin pueden usar la base de datos).

Conclusión

A lo largo de 4 entregas se han mencionado los valores de las distintas opciones en las categorías indicadas, es necesario indicar que muchos de los valores de las opciones establecidos por defecto, definidos desde la base de datos de sistema denominada model, son los que se utilizan cuando se crea una base de datos, no obstante, cada base de datos puede utilizar y establecer valores diferentes entre las opciones.

Una de las opciones que se sugiere sea el mismo en todas las bases de datos del servidor es el de la del nivel de compatibilidad, ya que esto permite que la base de datos pueda efectivamente utilizar las facilidades de la versión de Microsoft SQL Server. Otro de las opciones que se sugiere que se mantenga como la del servidor es la intercalación (collation), dado que cuando es diferente del que se tiene en las bases de datos de sistema, puede provocar errores y bajo desempeño en el uso.

Ya se ha indicado que esta página de propiedades de la base de datos brinda información de las opciones de la base de datos. Si se requiere usar T-SQL para obtener la información que se muestra en la pagina indicada, para la categoría varios, es posible usar la siguiente consulta.

/*******************************************************************************
-- Script : Get Database Options Properties Part 4 
-- Author : Julio J Bueyes
-- julio.bueyes@outlook.com
--
-- Description : This script helps to get a detailed view of the database properties – Options page – part 4.
--
-- DISCLAIMER. This Code is provided for the purpose of illustration only and is not intended to be used in a production environment. 
--
-- THIS CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 
-- INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************************/
-- Set the Database Name required
USE model;
GO
--- Recovery
SELECT page_verify_option_desc AS [Page Verify], 
    target_recovery_time_in_seconds AS [Target Recovery Time (Seconds)]
FROM sys.databases
WHERE database_id = db_id()
--- Service Broker
SELECT CASE is_broker_enabled WHEN 1 THEN 'True' ELSE 'False' END AS [Broker Enabled], 
    CASE is_honor_broker_priority_on WHEN 1 THEN 'True' ELSE 'False' END AS [Honor Broker Priority], 
    service_broker_guid AS [Service Broker Identifier]
FROM sys.databases
WHERE database_id = db_id()
-- State
SELECT CASE is_read_only WHEN 1 THEN 'True' ELSE 'False' END AS [Database Read Only], 
    CASE state_desc WHEN 'ONLINE' THEN 'NORMAL' ELSE state_desc END AS [Database State], 
    CASE is_encrypted WHEN 1 THEN 'True' ELSE 'False' END AS [Encryption Enabled],
    user_access_desc AS [Restrict Access]
FROM sys.databases
WHERE database_id = db_id()

Como se ha establecido previamente, pueden observarse de forma fácil obtener los datos directamente de la ventana de propiedades de la base de datos, en la página Opciones, no obstante, el script funciona para obtener los mismos valores proporcionados por la página.


miércoles, 25 de noviembre de 2020

SQL Server Propiedades de Base de Datos – General

Introducción

La principal razón de ser de Microsoft SQL Server es la de administrar las bases de datos de los usuarios, ya sea individuos o empresas, que requieren almacenar y manejar sus datos, la cual, se convertirá en la información esencial para los efectos requeridos.
Ya se ha indicado y expuesto las propiedades y configuración de los servicios de servidor de Microsoft SQL Server, en este post iniciaré con las propiedades de las bases de datos, un aspecto importante, que se manejará en estas entregas, es que la visión será la que se observe con el uso de SQL Server Management Studio, existirá una diferencia con la que se obtenga con otras herramientas, o con las características que se presentan en Azure.
Debe tenerse en cuenta que la ventana de Propiedades de Base de Datos presentara las siguientes páginas, las cuales se pueden ver en la parte izquierda de la ventana:
  • General – Presenta las propiedades generales de la base de datos
  • Archivos – Presenta las propiedades de los archivos conteniendo la base de datos
  • Grupo de Archivos – Presenta las propiedades de los grupos de archivos que se han definido para los archivos que contienen la base de datos
  • Opciones – Presenta los valores establecidos para distintas opciones de configuración de operación de la base de datos
  • Seguimiento de Cambios – Presenta los valores establecidos para llevar a cabo el seguimiento de los cambios realizados en la base de datos.
  • Permisos – Presenta los permisos otorgados a para la base de datos
  • Propiedades Extendidas – Presenta las propiedades establecidas por los usuarios para la base de datos
  • Reflejo – Presenta los valores establecidos para llevar a cabo las actividades de reflejo de las bases de datos
  • Envío de registro – Presenta los valores establecidos para llevar a cabo las actividades de envío de registro de la base de datos
  • Almacén de consultas – Presenta el comportamiento de las consultas llevadas a cabo en la base de datos.
Las últimas tres páginas de la lista anterior no están presentes en todas las bases de datos, las bases de datos de sistema no cuentan con ellas, dado que no puede establecerse una arquitectura de reflejo o de envío de registros. El uso de un almacén de consultas es una propiedad que fue aparece en Microsoft SQL Server 2016, por lo que esta propiedad no se encontrara en versiones previas.

Página General 

En esta ocasión, se presenta la pagina correspondiente a los aspectos generales de la base de datos, en esta página no es posible modificar los valores. Únicamente se presentarán los valores generales, como se observa a continuación:


Se puede apreciar que las propiedades mostradas están divididas en tres grupos, cabe mencionar que ningún valor de esta página puede ser modificado en ella, lo cual indica que los valores son de solo lectura. A continuación se explicarán cada una de las propiedades que se muestran en esta página.

Copias de seguridad

En esta sección se incluyen dos propiedades relacionadas a la base de datos, debe recordarse que una copia de seguridad es parte integral de la base de datos:

Propiedad
Descripción
Última copia de seguridad de la base de datos
En este espacio se muestra la fecha de la última copia de seguridad de la base de datos, obviamente una base de datos de reciente creación no mostrará algún dato en este espacio. Es importante indicar que es independiente del modelo de recuperación que se haya establecido a la base de datos.
Última copia de seguridad del registro de la base de datos
En este espacio se muestra la fecha en la que se realizó la última copia de seguridad del registro de transacciones de la base de datos. En este espacio se mostrará una fecha siempre que el modelo de recuperación sea completo o registro masivo, ya que el modelo de recuperación simple no permite realizar este tipo de copia de seguridad de registro de transacciones.

Base de Datos

Se refiere a propiedades directamente relacionadas a la base de datos:

Propiedad
Descripción
Nombre
En este espacio de muestra el nombre de la base de datos, este debe ser un nombre único dentro del servidor de Microsoft SQL Server. En muchas ocasiones se genera o define una base de datos se le asigna un nombre único, posteriormente se lleva a cabo una copia de seguridad y se restaura con un nombre diferente, de esta forma se tendrán dos bases de datos estructuralmente iguales con nombre diferente.
Estado
En este espacio se muestra el estado de la base de datos, es decir, el estado operacional de la base de datos, por defecto el estado es normal indicando que la base de datos está en linea, sin embargo, es posible obtener un estado diferente, dependiendo de las circunstancias operativas. Se indicarán los diferentes estados de la base de datos en la página Opciones. 
Propietario
Muestra el nombre del propietario de la base de datos.  El propietario se puede cambiar en la página Archivos.
Fecha de Creación
Muestra la fecha y hora en que se creó la base de datos, en el servidor. Cabe mencionar que muchas veces una base de datos es creada en un servidor diferente y al realizar la restauración desde una copia de seguridad, la fecha de la restauración se convierte en la fecha de creación de la base de datos.
Tamaño
Muestra el tamaño actual de la base de datos en megabytes.
Espacio Disponible
Muestra la cantidad de espacio disponible en la base de datos en megabytes.
Número de Usuarios
Muestra el número de usuarios configurados para la base de datos.

En la imagen se pueden apreciar dos propiedades adicionales, que están relacionadas con el uso de objetos optimizados en memoria, estableciendo los valores corrrespondientes a la cantidad de memoria asignada para esos objetos y la cantidad de memoria usada por esos objetos. Cabe mencionar que a partir de la version de Microsoft SQL Server 2014 se puede hacer uso de objetos optimizados en memoria.

Mantenimiento

Relacionado con el servicio de la base de datos. 

Propiedad
Descripción
Intercalación
Muestra la intercalación utilizada por la base de datos.  El tipo de intercalación se puede cambiar en la página Opciones de esta misma ventana.

Conclusión

Esta página inicial de las propiedades de la base de datos brinda información general de la base de datos, en caso de que se requiera más información de la base de datos, se deben acceder a las páginas correspondientes. Una forma alternativa de obtener la información de esta página a través del uso de T-SQL es utilizando el siguiente script para obtener los datos referidos en la página General:

/*******************************************************************************
-- Script : Get Database Properties General
-- Author : Julio J Bueyes
-- julio.bueyes@outlook.com
--
-- Description : This script helps to get a summarized view of the database properties – General page.
--
-- DISCLAIMER. This Code is provided for the purpose of illustration only and is not intended to be used in a production environment. 
--
-- THIS CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 
-- INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************************/
-- Set the Database Name required
USE [Model];
GO

-- Declare a table variable to temporary store values 
DECLARE @DBSize TABLE
(
DBName sysname,
dbSize nvarchar(20),
dbUnaloc nvarchar(20),
reserved nvarchar(20),
datasize nvarchar(20),
idxSize nvarchar(20),
unused nvarchar(20)
)

-- Get the Space Used for database into table variable
INSERT INTO @DBSize
exec sp_spaceused   @oneresultset=1;

-- Generate Common Table expressions to generate query 
WITH LastFullBackup (database_name, LastBackupDate)
AS (
SELECT database_name, Max(backup_start_date) 
FROM msdb..backupset
WHERE type = 'D'
GROUP BY database_name
)
,
LastLogBackup (database_name, LastLogDate)
AS
(
SELECT database_name, Max(backup_start_date)
FROM msdb..backupset
WHERE type = 'L'
GROUP BY database_name
)
,
TotUsers (database_name, totUsers)
AS
(
SELECT DB_NAME(), COUNT(1) 
FROM sys.database_principals
WHERE type in ('S','U')
)
SELECT b.LastBackupDate AS [Last Database Backup], 
l.LastLogDate AS [Last Database Log Backup], 
d.name, state_desc as [Status], sl.name AS [Owner], 
d.create_date AS [Date Created], ds.dbSize AS [Size], 
ds.dbUnaloc AS [Space Available], 
t.totUsers as [Number of Users], d.collation_name AS [Collation]
FROM sys.databases d
INNER JOIN sys.syslogins sl ON d.owner_sid = sl.sid
INNER JOIN @DBSize ds ON d.name = ds.DBName COLLATE DATABASE_DEFAULT
LEFT OUTER JOIN LastFullBackup b ON d.name = b.database_name
LEFT OUTER JOIN LastLogBackup l ON d.name = l.database_name
INNER JOIN TotUsers t ON d.name = t.database_name
WHERE d.name = DB_Name() COLLATE DATABASE_DEFAULT;

Como puede observarse es mas fácil obtener los datos directamente de la ventana de propiedades de la base de datos, en la página General, sin embargo, el script funciona para obtener los mismos valores proporcionados, solo que en esta ocasión en un solo renglón.

martes, 29 de octubre de 2019

SQL Server Homologar intercalación en una base de datos

Introducción

Muchas veces cuando estamos desarrollando o bien administrando un servidor de base de datos se presenta la necesidad de adquirir una base de datos que fue generada en un servidor diferente, ya sea por la vía de una restauración o por agregar los archivo correspondientes en el directorio seleccionado, es común que esta base de datos adquirida se presenta con una intercalación diferente a la que se tiene definida en el servidor. 

Intercalación de la instancia de Microsoft SQL Server

Para obtener la intercalación que se tiene en la instancia de Microsoft SQL Server del servidor, se sabe que es la que está definida en la base de datos master, de tal forma que es posible obtener esta información utilizando la consulta siguiente:

SELECT collation_name FROM sys.databases where name = 'master'

Como una mejor práctica de operación, se sabe que es importante que la intercalación de las bases de datos sea la misma que la que se tiene en la configuración de la instancia de Microsoft SQL Server en el servidor para mejorar el rendimiento, ya que en caso contrario será necesario que en las consultas se haga referencia a la intercalación adecuada.

Cambiar la intercalación de la base de datos

El cambio de la intercalación de una base de datos es sencillo realizarlo con las sentencias de Microsoft SQL Server, de tal forma que para cambiar la intercalación utilizamos la siguiente sentencia:

ALTER DATABASE [DatabaseName] COLLATE [CollateName]

Si bien esta sentencia cambia la intercalación de la base de datos, no necesariamente cambia la intercalación de todas las columnas de las tablas de la base de datos. Entonces, qué hacer para ese caso, una solución es abrir la definición de cada tabla y cambiar manualmente la intercalación, o utilizar la sentencia ALTER TABLE para cambiar la intercalación de cada columna, esto puede ser una tarea muy lenta.

Que intercalación usan las columnas de las tablas de la base de datos

Cuando ocurre esta situación hace falta una herramienta o bien un script que nos ayude a cambiar la intercalación de todas las columnas de tipo char, varchar, nchar, nvarchar (en versiones previas de Microsoft SQL Server se utilizaban los tipos de datos ntext o text) que haya en las distintas tablas de la base de datos. Es entonces útil saber que toda la información de la base de datos se encuentra definida en las tablas del sistema, más específicamente la tabla INFORMATION_SCHEMA.COLUMNS contiene todas las columnas definidas de las tablas de la base de datos, por lo que la siguiente consulta nos arrojara la información de todas las columnas de tipo char, varchar, nchar y nvarchar (text y ntext en el caso de las versiones anteriores) de las tablas de la base de datos:

USE DatabaseName

SELECT Table_Schema+'.'+Table_Name, Column_Name, Data_Type, CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE ='BASE TABLE')
  AND (Data_Type = 'char' OR Data_Type = 'varchar' OR Data_Type = 'nchar' OR Data_Type ='nvarchar' OR Data_Type = 'text' OR Data_Type = 'ntext')
ORDER BY Table_Schema,Table_Name

Esto nos dará como resultado las tablas, con sus respectivos esquemas, en nombre de la columna, el tipo y la longitud de la columna, existe una consideración para los tipos de datos varchar(max) y nvarchar(max) que a partir de la versión 2005 se incluye para sustituir los tipos text y ntext, que el valor para la longitud aparece como -1.

Cambiar la intercalación de una columna de la tabla

Para cambiar la intercalación de una columna de los tipos de datos indicados, se debe utilizar el siguiente comando de T-SQL:

ALTER TABLE TableName ALTER COLUMN ColumnName DataType(MaxLength) COLLATE CollateName

Donde; 
  • DataType es uno de los tipos char, varchar, nchar, nvarchar, ntext o text
  • MaxLength es la longitud de la columna, no se especifica en el caso de text o ntext.
  • En una base de datos con 50 tablas en la que participe, se localizaron aproximadamente 210 columnas que contenían los tipos de datos especificados anteriormente. Imagínense que se hiciera la siguiente instrucción por cada una de las columnas identificadas, ello tomaría demasiado tiempo en realizarlo, ademas de lo monótono que se convertiría esa tarea.

Script para realizar el cambio de intercalación en una base de datos

Es por ello que he desarrollado un script que utiliza un cursor para llevar a cabo el cambio en las columnas de todas las tablas por la intercalación especificada, como se muestra a continuación:


/*********************************************************************************************
** Author:  Julio J. Bueyes (jjbueyes@computer.org)
** Date:     Abril, 2009
** Purpose: Standardize the collation of a database and table columns with the collation defined on the server
** DISCLAIMER. Sample Code is provided for the purpose of illustration only and is not intended to be used in a production environment. 
THIS SAMPLE CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 
INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. 
**********************************************************************************************/

--- Process variables definition
DECLARE @TableName AS varchar(100)              -- Set the schema and table name 
DECLARE @ColumnName AS varchar(60)             -- Set the column name
DECLARE @DataType AS varchar(10)         -- Set the column data type
DECLARE @MaxLength AS varchar(5)         -- Set the column length
DECLARE @Command AS varchar(1000) -- Set the Sql Command to execute
DECLARE @UseDB  AS varchar(1000)         -- Set the database to use

--- Variables used as constants definition 
DECLARE @Collate AS varchar(50)                 -- Set Collation value
DECLARE @Database AS varchar(50) -- Set Database name

---**** Setting the constant values *****

--- Setting the server collation
SET @collate = (SELECT Collation_name FROM Sys.Databases WHERE Name = 'master')
PRINT 'Collate actually used in Server: ' + @collate;

---******* CHANGE THE DATABASE NAME before execute *******

--- Set the database name to be homologated 
SET @Database = 'DatabaseName';

--- Validate the Database Name
IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = @Database)
PRINT 'Must specify a valid database name, look at CHANGE THE DATABASE NAME Section'
ELSE
BEGIN
PRINT 'Database to be standardized: ' + @Database;

--- Set the database collation getting from server 
SET @Command = 'ALTER DATABASE ' + @Database + ' COLLATE ' + @Collate;
EXEC (@Command)


--- **** Initiate process *****

--- Set the database to use
SET @Command = 'USE ' + @Database + CHAR(13);
PRINT @Command
EXEC (@Command);


--- Declaring a cursor with the information of the columns of all tables in the database
DECLARE CurTables CURSOR LOCAL FORWARD_ONLY READ_ONLY 
FOR 
SELECT Table_Schema+'.'+Table_Name, Column_Name, Data_Type, CHARACTER_MAXIMUM_LENGTH 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME IN (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE')
  AND (Data_Type = 'char' OR Data_Type = 'varchar' OR Data_Type = 'nchar' OR Data_Type = 'nvarchar' OR Data_Type = 'text' OR Data_Type = 'ntext')
ORDER BY Table_Schema,Table_Name;

-- Open the cursor and fetch the first record
OPEN CurTables
FETCH NEXT FROM CurTables INTO @TableName, @ColumnName, @DataType, @MaxLength

-- While there are records in the cursor change columns collation in the database's tables
WHILE @@FETCH_STATUS = 0
BEGIN
       -- Identify text or another data type
       IF @DataType = 'char' OR @DataType = 'varchar' OR @DataType = 'nchar' OR @DataType = 'nvarchar'
           SET @Command = 'ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @DataType + '(' + CASE @MaxLength WHEN -1 THEN 'max' ELSE @MaxLength END + ') COLLATE ' + @Collate
       ELSE
           SET @Command = 'ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @DataType + ' COLLATE ' + @Collate

       -- Log the command before execute
       PRINT @Command

       -- Execute the command
       EXEC (@Command)

       -- Fetch next record from cursor
       FETCH NEXT FROM CurTables INTO @TableName, @ColumnName, @DataType, @MaxLength
END

-- Close and deallocate cursor
CLOSE CurTables
DEALLOCATE CurTables

--- Finishing Process
PRINT 'The columns of the tables in the specified database have been approved with the server collation'; 
END


Conclusión

Como se ha podido observar, con el anterior script que estoy ofreciendo, se obtiene la intercalación del servidor y se aplica a la base de datos y a las columnas de tipo char, nchar, varchar, nvarchar (y en caso de versiones anteriores los tipos de datos text y ntext), con el objetivo de mejorar el desempeño de las consultas y evitar los usos de la especificación de la intercalación en las mismas.

Mucho he de agradecer sus comentarios sobre el uso de este script, con el fin de llevar a cabo las mejoras correspondientes y que pueda servir en futuras versiones de Microsoft SQL Server.

lunes, 19 de agosto de 2019

SQL Server Intercalación

SQL Server Intercalación

Introducción

Microsoft SQL Server, como un sistema de administración de bases de datos, tiene entre sus propósitos la entrega de los datos en un cierto orden, de esta manera utiliza lo que se denomina intercalación que podemos describir como el proceso de cotejo y ordenamiento.
Según el diccionario, Cotejo se define como: el acto de reunir personas o elementos en un orden para un propósito específico.
La intercalación de Microsoft SQL Server se identifica con una sencilla cadena de caracteres para especificar el nombre. Es importante indicar que Microsoft SQL Server soporta tanto el uso  de intercalación de Windows como de Microsoft SQL Server, existen alrededor de 80 nombres de intercalación que pueden ser usados en Microsoft SQL Server y que fueron desarrolladas antes de que soportara las de Windows, es por ello que las intercalaciones de Microsoft SQL Server aun se soportan como compatibilidad de las versiones anteriores, Microsoft recomienda el uso de intercalación Windows en lugar de la intercalación de Microsoft SQL Server en nuevas instalaciones y desarrollos.

Página de código

Es importante mantener en mente que para llevar a cabo la intercalación existe un elemento denominado página de código, que en computación es una codificación de caracteres, esto es, la asociación especifica de un conjunto de caracteres imprimibles y caracteres de control con numeración única. El término "página de código" fue introducido por IBM en los sistemas mainframe basados en EBCDIC. La mayoría de los proveedores, como Microsoft, identifican sus propios conjuntos de caracteres por un nombre. Originalmente, los números de página de códigos se refieren a los números de página en el manual del juego de caracteres estándar de IBM, una condición que no se ha mantenido durante mucho tiempo. Los proveedores que usan un sistema de página de códigos asignan su propio número de página de códigos a una codificación de caracteres, incluso si es mejor conocido por otro nombre; por ejemplo, a UTF-8 se le han asignado el número de página 65001 en Microsoft.

Nombres de Intercalación

Intercalación de SQL

Los nombres de intercalación que se pueden encontrar en el caso de los que se desarrollaron para Microsoft SQL Server mantienen la siguiente sintaxis.

Nombre_Intercalación_SQL = SQL_ReglasDeOrden[_Pref]_CPPáginaCódigo_EstiloComparación

Donde:
  • ReglasDeOrden es una cadena que identifica el alfabeto o lenguaje cuyas reglas de clasificación se aplican cuando se especifica la clasificación del diccionario.
  • Pref especifica la preferencia en mayúsculas. Incluso si la comparación no distingue entre mayúsculas y minúsculas, la versión en mayúscula de una letra se ordena antes que la versión en minúscula, cuando no hay otra distinción.
  • PáginaCódigo Especifica un número de uno a cuatro dígitos que identifica la página de códigos utilizada por la clasificación. CP1 especifica la página de códigos 1252, para todas las demás páginas de códigos se especifica el número de página de códigos completo. Por ejemplo, CP1251 especifica la página de códigos 1251 y CP850 especifica la página de códigos 850.
  • EstiloComparación es la combinación de estilos que identifican la sensibilidad de mayúsculas y minúsculas, indicando ya sea CI como insensible en mayúsculas y minúsculas o CS como sensible en mayúsculas y minúsculas; la sensibilidad de los acentos, indicando ya sea AI como insensible en acentos o AS como sensible en acentos; o bien se puede indicar el orden de clasificación binario.

Para enumerar las intercalaciones de Microsoft SQL Server admitidas por su servidor, podemos ejecutar la siguiente consulta:

SELECT * FROM sys.fn_helpcollations()
WHERE name LIKE 'SQL%';

con esta sentencia podemos observar casi 80 renglones indicando el nombre y la descripción asociada con las intercalaciones.

Intercalación de Windows

El nombre de intercalación de Windows se compone del designador de intercalación y los estilos de comparación, siguiendo la siguiente sintaxis.
Nombre_Intercalacion = DesignadorIntercalación_EstiloComparación

Donde:
  • DesignadorIntercalación Especifica las reglas de intercalación base utilizadas por la intercalación de Windows. Las reglas básicas de intercalación cubren lo siguiente: Las reglas de clasificación y comparación que se aplican cuando se especifica la clasificación del diccionario. Las reglas de clasificación se basan en el alfabeto o el idioma. La página de códigos utilizada para almacenar datos de tipo alfabético.
  • EstilosComparación como ya se mencionó, identifican la sensibilidad de mayúsculas y minúsculas, la sensibilidad en acentos, también en este caso se puede indicar la sensibilidad de tipos kana, se especifica KS indicando sensible a tipos kana y la omisión indica insensible a tipos kana; la sensibilidad de ancho se especifica colocando WS indicando sensible al ancho y la omisión indica insensible al ancho, obviamente este ultimo se refiere a los tipos kana. Ya se ha indicado que puede indicarse el orden de clasificación binario compatible con las versiones anteriores o la especificación de un orden de clasificación binario que use semántica de comparación de puntos de código. A partir de Microsoft SQL Server 2017, es posible indicar una opción denominada sensibilidad de variación al selector, indicando VSS se establece la variación sensible al selector y la omisión indicará la variación insensible al selector.
  • Es importante indicar qué, dependiendo de la versión de la clasificación, algunos puntos de código pueden no tener pesos de clasificación y/o asignaciones en mayúsculas/minúsculas definidas. Finalmente, es posible que en algunos nombres de intercalación se especifique la existencia de caracteres suplementarios (SC), la omisión de este indica que no se contemplan caracteres suplementarios.

Para enumerar las intercalaciones de Microsoft SQL Server admitidas por su servidor, podemos ejecutar la siguiente consulta:

SELECT * FROM sys.fn_helpcollations()
WHERE name NOT LIKE 'SQL%';

Con esta sentencia podemos observar más de 3000 renglones indicando el nombre y la descripción asociada con las intercalaciones.

Funcionamiento

Cómo es posible observar, la intercalación es utilizada para las columnas que almacenan caracteres alfabéticos, entre los que se encuentran los tipos CHAR, VARCHAR y NVARCHAR.
Al momento de la instalación de una instancia de Microsoft SQL Server se solicita se indique cual intercalación se utilizara en esa instancia, por ello, es posible que en un servidor tengamos instancias que utilicen intercalación diferente entre ellas.
La intercalación, durante la actividad de instalación de una nueva instancia se presenta en la sección de configuración del servidor, por omisión, se muestra la intercalación denominada SQL_Latin1_General_CP1_CI_AS, lo que indica una intercalación de Microsoft SQL Server usando las reglas de orden Latin1_General, con una pagina de código 1252 con insensibilidad a las mayúsculas y minúsculas, y sensible a los acentos, como se aprecia en la siguiente figura.


La selección de una intercalación diferente se logra oprimiendo el botón, identificado como [Customize…], no abundaremos en este punto ya que no estamos tratando el tema de la instalación.
Esta intercalación será entonces la que mantenga en las 4 bases de datos de sistema (master, tempdb, msdb y model).  Para revisar la intercalación que se tiene una instancia de Microsoft SQL Server, podemos revisar las propiedades y aparece el nombre de la intercalación utilizada en la primera página de las propiedades, como se observa en la siguiente imagen:


O bien, es posible ejecutar la siguiente sentencia usando T-SQL

SELECT SERVERPROPERTY(‘COLLATION’) as Intercalacion

El resultado de ésta sentencia nos brindara cómo resultado el nombre de la intercalación que se encuentra definida en la instancia de Microsoft SQL Server.
De esta manera, cuando se crea una base de datos de usuario en la instancia de Microsoft SQL Server, la base de datos a crear mantendrá la intercalación de la instancia, a menos que se especifique en la cláusula de creación, un nombre diferente de intercalación. Es posible revisar la intercalación que se encuentra definida para la base de datos usando las propiedades de esta, mostrando la información en las propiedades generales, como se muestra a continuación:


También es posible obtener el nombre de la intercalación que esta usando una base de datos, usando la siguiente sentencia de T-SQL:

SELECT collation_name as Intercalacion
FROM sys.databases
WHERE name = ‘baseDatos’

Así, cuando se crea una tabla dentro de una base de datos de usuario, todas las columnas de los tipos CHAR, VARCHAR, NVARCHAR tendrán la intercalación de la base de datos, a menos que se indique un nombre diferente de intercalación diferente para esa columna.
La intercalación de cada columna se puede observar en las propiedades de columna, como se puede observar en la siguiente figura:


Si se desea conocer la intercalación de todas las columnas de datos alfabéticos de una tabla en una determinada base de datos utilice la siguiente sentencia de T-SQL:

USE [database]
GO

SELECT name as Columna, TYPE_NAME(user_type_id) as DataType, collation_name as Intercalacion
FROM sys.columns
WHERE object_id = OBJECT_ID(‘tableName’)
AND collation_name IS NOT NULL;

Intercalaciones diferentes

Que pasa si la instancia de Microsoft SQL Server esta utilizando la intercalación SQL_Latin1_General_CP1_CI_AS (Latin1-General, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive for Unicode Data, Microsoft SQL Server Sort Order 52 on Code Page 1252 for non-Unicode Data) y mi base de datos esta utilizado SQL_Latin1_General_CP1251_CI_AS (Latin1-General, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive for Unicode Data, Microsoft SQL Server Sort Order 106 on Code Page 1251 for non-Unicode Data)? aquí la diferencia esta en el ordenamiento, en el primer caso se usa el orden 52 y en el segundo caso el orden 106.
Hay que recordar que al momento de llevar a cabo una consulta dentro de Microsoft SQL Server, los resultados intermedios se llevan a cabo en la base de datos tempdb,  por lo que al momento de llevar a cabo comparaciones y ordenamiento en la consulta, tratara de usar el orden de intercalación de la base de datos tempdb, esto es, usara la que esta definida para la instancia de Microsoft SQL Server, y es posible que indique un mensaje de error o bien, el resultado de la consulta sea en un orden diferente al deseado. es por ello por lo que debe usarse la cláusula COLLATE para indicar que tipo de intercalación se desea, ya sea para la creación de una base de datos, como para la creación de alguna columna en una tabla, o bien, para la realización de las consultas a los datos almacenados.

Crear una base de datos

Para crear una base de datos usando una intercalación especifica, diferente de la que se esta usando en la instancia actual de Microsoft SQL Server, se puede utilizar la siguiente sentencia, para más información de la sentencia viste CREATE DATABASE.

CREATE DATABASE Sample
ON PRIMARY
(NAME = Sample)
LOG ON
(NAME = Sample_Log)
COLLATE SQL_Latin1_General_CP1_CS_AS;

La anterior sentencia creara una base de datos con la intercalación de SQL con las reglas de orden Latin1_General usando la página de código 1252 (CP1), sensible entre mayúsculas y minúsculas (CS) y con sensibilidad en los acentos (AS).

Crear una Tabla

Se sabe que la intercalación es una propiedad que se hereda, de una instancia de servidor a base de datos, de base de datos a tabla, en las columnas que son alfabéticas, es por ello que durante la creación de una tabla generalmente no se indica una intercalación diferente, pero es posible crear una tabla dentro de una base de datos con intercalación, diferente a la de la base de datos, en una columna, para lo que utilizaremos una sentencia de creación como la que se indica a continuación, para mas información de la sentencia visite CREATE TABLE.

CREATE TABLE SampleTab1
(
   Col1 int IDENTITY (1,1),
   Col2 varchar(20) COLLATE SQL_Latin1_General_CP1_CS_AS,
   Col3 varchar(20)
);

Como podemos ver, en este ejemplo, si la base de datos tiene la intercalación SQL_Latin1_General_CP1_CS_AS que es sensible en el uso de las mayúsculas y minúsculas, en la columna Col2 se ha indicado que se desea que se utilice una intercalación que se insensible a las mayúsculas y minúsculas, y ¿qué significa eso? Pues significa que muestras para la columna Col3 y todas las columnas que se definan con la intercalación por omisión dentro de la base de datos se mantendrá el orden de presentación de los resultados permitiendo la presentación de las mayúsculas en primer lugar y después las minúsculas, pero en la columna Col2, no se distinguirá entre mayúsculas y minúsculas para la presentación de los resultados.

Consultas

Hemos hecho el ejercicio utilizando un servidor que cuenta con la intercalación SQL_Latin1_General_CP1_CI_AS, y utilizando la definición de tabla que hemos definido anteriormente, insertamos los siguientes valores:

INSERT INTO SampleTab1
VALUES
('Madrid', 'Madrid'),
('Morelos','MORELOS'),
('MORELOS', 'Morelos'),
('Morelos', 'Morelos'),
('Merida', 'Mérida'),
('Mérida', 'Merida'),
('MÉRIDA', 'Merida'),
('Mérida', 'MÉRIDA'),
('Michoacan', 'Michoacan'),
('Michoacán', 'MICHOACAN'),
('MICHOACÁN', 'Michoacán'),
('Mexico', 'México'),
('México', 'Mexico'),
('MEXICO', 'México'),
('MÉXICO', 'MEXICO');

Realizando una consulta usando la intercalación de la base de datos

SELECT Col1, Col2, Col3
FROM SampleTab1
ORDER BY Col2 COLLATE database_default;

En este caso el resultado de la consulta fue el siguiente:

Col1
Col2
Col3
1
Madrid
Madrid
5
Merida
Mérida
6
Mérida
Merida
7
MÉRIDA
Merida
8
Mérida
MÉRIDA
12
Mexico
México
14
MEXICO
México
15
MÉXICO
MEXICO
13
México
Mexico
9
Michoacan
Michoacan
10
Michoacán
MICHOACAN
11
MICHOACÁN
Michoacán
2
Morelos
MORELOS
3
MORELOS
Morelos
4
Morelos
Morelos

Se puede apreciar que la información se presenta ordenada por el contenido de la columna Col2, y si recordamos la base de datos mantiene una intercalación que no es sensible a las mayúsculas y minúsculas, por lo que toma en cuenta únicamente el orden de las palabras acentuadas, es por ello que aparecen primero las palabras sin acento y después las palabras acentuadas. 

Realizando una consulta usando la intercalación de la columna

SELECT Col1, Col2, Col3
FROM SampleTab1
ORDER BY Col2 COLLATE SQL_Latin1_General_CP1_CS_AS;

Para esta consulta, el resultado es:

Col1
Col2
Col3
1
Madrid
Madrid
5
Merida
Mérida
7
MÉRIDA
Merida
8
Mérida
MÉRIDA
6
Mérida
Merida
14
MEXICO
México
12
Mexico
México
15
MÉXICO
MEXICO
13
México
Mexico
11
MICHOACÁN
Michoacán
9
Michoacan
Michoacan
10
Michoacán
MICHOACAN
3
MORELOS
Morelos
4
Morelos
Morelos
2
Morelos
MORELOS

En este caso, se ha indicado que utilice la intercalación de la columna, es por ello que ahora vemos que primero aparecen las palabras en mayúscula y después aparecen las palabras en minúscula, asimismo se observa esta situación para el caso de las palabras acentuadas, primero las mayúsculas y después las minúsculas.

Realizando una consulta usando la intercalación de la instancia

SELECT Col1, Col2, Col3
FROM SampleTab1
ORDER BY Col3;

En este caso, el resultado de la consulta es:

Col1
Col2
Col3
1
Madrid
Madrid
6
Mérida
Merida
7
MÉRIDA
Merida
8
Mérida
MÉRIDA
5
Merida
Mérida
13
México
Mexico
15
MÉXICO
MEXICO
14
MEXICO
México
12
Mexico
México
9
Michoacan
Michoacan
10
Michoacán
MICHOACAN
11
MICHOACÁN
Michoacán
2
Morelos
MORELOS
3
MORELOS
Morelos
4
Morelos
Morelos

Finalmente, podemos observar que ahora se ha tomado el ordenamiento de la columna Col3, y toma como característica de intercalación la que se ha definido en la instancia de Microsoft SQL Server, recuerde que al no indicar que intercalación debe utilizarse, se toma la intercalación definida por el servicio.

Comentarios

Como hemos visto, la intercalación se ha usado en los sistemas de computo en general desde hace mucho tiempo, y tiene gran relevancia en los sistemas de administración de bases de datos, como Microsoft SQL Server, debido a que debe llevarse a cabo el cotejo de elementos para efectuar las ordenaciones de la información que se debe entregar al realizar la consulta de los datos almacenados. Es importante recordar que dependiendo de las características de la intercalación que se utilice para realizar las consultas, es la forma en que se nos presentará la información.
Recordemos que la intercalación, además de tomar en cuenta el conjunto de caracteres que se utilizan, también toma en cuenta la sensibilidad de las mayúsculas y minúsculas y la importancia de los acentos, recordando que, en caso de la sensibilidad en mayúsculas y minúsculas, primero se colocan las mayúsculas y después las minúsculas y que, en caso de las palabras acentuadas, las letras acentuadas van después de las minúsculas sin acentuar. Como hemos observado en los resultados obtenidos de los ejercicios.