sql >> Base de Datos >  >> RDS >> Database

Comprender la intercalación del nivel de la base de datos y el impacto de cambiarla por una base de datos

Cuando desarrolla una aplicación o escribe un código en el sistema de base de datos SQL, es crucial comprender cómo se ordenarán y compararán los datos. Puede almacenar sus datos en un idioma específico, o puede querer que SQL Server trate los datos que distinguen entre mayúsculas y minúsculas y los que no distinguen entre mayúsculas y minúsculas por separado. Microsoft ha proporcionado una configuración de SQL Server llamada Collation para controlar y abordar dichos requisitos.

¿Qué es la intercalación en SQL Server?

Podemos configurar la intercalación en varios niveles en SQL Server como se indica a continuación.

  • Nivel de servidor
  • Nivel de base de datos
  • Nivel de columna
  • Nivel de expresión

La intercalación de nivel de servidor a veces se puede llamar intercalación de nivel de instancia de SQL Server .

La intercalación de nivel de base de datos se heredará de la configuración de intercalación de nivel de servidor si no elige ninguna intercalación específica durante la creación de la base de datos. También puede cambiar la intercalación de nivel de base de datos más adelante. Tenga en cuenta que el cambio de intercalación de la base de datos se aplicará solo a los objetos próximos o nuevos que se crearán después del cambio de intercalación.

La nueva intercalación no modificará los datos existentes almacenados en las tablas que se ordenaron con el último tipo de intercalación. El equipo de aplicaciones necesita más planificación para manejar esta conversión de datos almacenados debido a la nueva configuración de intercalación.

Hay varias formas de hacerlo. Una es copiar los datos de la tabla existente a una nueva tabla creada con la nueva intercalación y luego reemplazar la tabla anterior con la nueva. También puede mover los datos de su tabla a una nueva base de datos al tener una nueva intercalación y reemplazar la base de datos anterior con la nueva.

NOTA :Cambiar la intercalación es una tarea compleja y debe evitarla a menos que tenga un caso comercial obligatorio.

¿Cómo buscar y cambiar la intercalación de bases de datos en SQL Server?

Avancemos y verifiquemos la recopilación de la instancia de SQL Server y todas las bases de datos alojadas en esa instancia. Puede verificar la intercalación accediendo a la base de datos o al nivel de instancia propiedades ventana usando SQL Server Management Studio o simplemente ejecutando la siguiente instrucción T-SQL. La intercalación de cada base de datos se almacena en el objeto del sistema sys.databases – accederemos a él para obtener esta información.

--Check Database Collation
SELECT name, collation_name  
FROM sys.databases  
GO  
--Check Server or Instance level Collation
SELECT SERVERPROPERTY('Collation') As [Instance Level Collation]

Ejecuté la declaración T-SQL anterior y obtuve el siguiente resultado. Podemos ver que todas las bases de datos y la intercalación a nivel de servidor tienen la misma configuración que SQL_Latin1_General_CP1_CI_AS . Significa que las intercalaciones de bases de datos han sido heredadas por la intercalación de nivel de servidor al crearlas, y el valor predeterminado no se ha cambiado.

Ahora, permítame mostrarle cómo verificar la intercalación de la base de datos mediante la GUI en SQL Server Management Studio.

Primero, conéctese a su instancia de SQL Server usando SQL Server Management Studio. Expanda el nodo de instancia seguido de Bases de datos carpeta. Haga clic con el botón derecho en la base de datos de destino y seleccione Propiedades :

Obtendrá las siguientes Propiedades de la base de datos ventana.

Ahora haz clic en Opciones pestaña del panel del lado izquierdo. Obtendrá múltiples configuraciones de propiedades en el panel del lado derecho. Colección es la primera propiedad de esta página; puede ver que es igual que en el script T-SQL anterior.

De manera similar, puede hacer clic en el nodo de instancia de SQL Server y hacer clic con el botón derecho en las propiedades de nivel de instancia para ver la intercalación a nivel de servidor.

Si desea cambiar esta intercalación a una nueva intercalación, solo tiene que hacer clic en Intercalación desplegable y elige la opción que necesites. Asegúrese de haber realizado una copia de seguridad completa de su base de datos antes de hacerlo.

Elegí una intercalación similar con mayúsculas y minúsculas SQL_Latin1_General_CP1_CS _AS para esta base de datos e hizo clic en Aceptar para aplicarlo. Nota:asegúrese de que nadie esté conectado a la base de datos de destino durante este procedimiento; de lo contrario, deberá cambiar el modo a uno de usuario único y cambiar esta configuración.

También puede cambiar esta intercalación de base de datos mediante la instrucción T-SQL. Para eso, use el COLLATE cláusula de la sentencia ALTER DATABASE.

Primero, hemos cambiado la base de datos a usuario único luego cambió la intercalación y, finalmente, movió la base de datos al modo multiusuario modo.

--Change Database Collation using T-SQL  
USE master;  
GO  
Alter DATABASE [AdventureWorks2019] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [AdventureWorks2019]  
COLLATE SQL_Latin1_General_CP1_CI_AS;  
GO
Alter DATABASE [AdventureWorks2019] SET MULTI_USER

Lista de todas las intercalaciones admitidas en SQL Server

Esta sección le mostrará cómo encontrar todas las intercalaciones disponibles en SQL Server. Primero, permítame mostrarle cómo obtener la lista de todas las intercalaciones admitidas para la instancia de SQL Server.

SQL Server tiene una función de sistema llamada fn_helpcollations() que puede usar para obtener todas las intercalaciones.

Ejecute el siguiente comando para mostrar la lista.

--Display the list of all collations  
SELECT name, description FROM fn_helpcollations()

Podemos ver todas las intercalaciones compatibles con 5508 en la sección de salida. Si no está seguro de qué intercalación elegir, puede usar la cláusula WHERE en el siguiente script para filtrar todas las posibles intercalaciones que se pueden configurar en la base de datos.

Supongamos que necesita almacenar sus datos en el idioma inglés de EE. UU. y desea que SQL Server los maneje en un formato que distingue entre mayúsculas y minúsculas. Puede usar el siguiente comando para obtener la lista de intercalaciones posibles y admitidas para su consulta:

--Display the list of all collations with WHERE clause 
SELECT Name, Description FROM fn_helpcollations()  
WHERE Name like 'SQL_Latin1%' AND Description LIKE '%case-sensitive%’

El resultado muestra solo 10 intercalaciones que satisfacen su consulta. Puede usar la secuencia de comandos anterior para filtrar varias intercalaciones.

Impacto de cambiar la intercalación de la base de datos en el resultado de la consulta

En esta sección, le mostraré la diferencia entre los dos resultados de la misma consulta cuando se ejecutan con intercalaciones diferentes.

Primero, crearé una base de datos llamada MSSQL con una intercalación (SQL_Latin1_General_CP1_CS _AS ). Luego ejecutaré la misma consulta dos veces para obtener el resultado. Más tarde, cambiaré la intercalación a SQL_Latin1_General_CP1_CI _AS y nuevamente ejecute las mismas consultas para obtener su salida. Puede comparar ambos resultados y comprender el impacto de cambiar la intercalación de una base de datos. Entonces, comencemos con la creación de la base de datos.

Inicie la nueva ventana de creación de base de datos como se muestra en la imagen de abajo. También puede crear esta base de datos usando T-SQL. Después de eso, puede ver el nombre de la base de datos y sus archivos de datos. Ahora, haga clic en la segunda pestaña en el panel del lado izquierdo para cambiar a la ventana de propiedades de intercalación.

Puede ver que el nombre de intercalación de esta base de datos es el predeterminado . Significa que esta base de datos heredará la intercalación del tipo de intercalación a nivel de servidor. Haz clic en la Colección menú desplegable para elegir su nueva colación.

He seleccionado la siguiente colación SQL_Latin1_General_CP1_CS _AS para esta base de datos, no la predeterminada. Haz clic en Aceptar para continuar con la creación de la base de datos.

Ahora, verifique la intercalación de la base de datos para una base de datos recién creada. Podemos ver que es SQL_Latin1_General_CP1_CS _AS como hemos seleccionado en el paso anterior.

En SQL_Latin1_General_CP1_CS _AS , CS significa sensible a mayúsculas y minúsculas modo y CI significa insensible a mayúsculas y minúsculas modo. Ahora puede ejecutar el siguiente código T-SQL o cualquier código para obtener el resultado.

He ejecutado el mismo comando dos veces. El primer script filtra los nombres de las columnas con un valor SYS en capital letras, mientras que el segundo script filtrará la misma columna con el mismo valor sys en pequeño letras. La sección de salida demuestra que la primera secuencia de comandos no ha mostrado ninguna salida, mientras que la segunda secuencia de comandos ha mostrado la salida debido a su comportamiento que distingue entre mayúsculas y minúsculas.

Select * from sysusers
Where name=’SYS’
Go
Select * from sysusers
Where name=’sys’
GO

Ahora, cambiaremos la intercalación de esta base de datos a la intercalación que no distingue entre mayúsculas y minúsculas SQL_Latin1_General_CP1_CI _AS ejecutando las siguientes declaraciones T-SQL. También puede cambiarlo a través de la GUI accediendo a la ventana Propiedades de la base de datos en SQL Server Management Studio.

--Change database collation to SQL_Latin1_General_CP1_CI_AS
USE master;  
GO  
Alter DATABASE [MSSQL] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [MSSQL]  
COLLATE SQL_Latin1_General_CP1_CI_AS;  
GO
Alter DATABASE [MSSQL] SET MULTI_USER

Ejecuté el script anterior de una sola vez y la intercalación de la base de datos se cambió con éxito a una nueva intercalación que no distingue entre mayúsculas y minúsculas.

Puede verificar este cambio ejecutando los siguientes scripts para verificar la intercalación de la base de datos MSSQL recién creada. Podemos ver que la nueva intercalación está configurada para esta base de datos en la imagen a continuación.

Volveremos a ejecutar la misma instrucción T-SQL antes de cambiar la intercalación para ver el impacto de este cambio. Como podemos ver ahora, ambas declaraciones T-SQL están en la salida.

Conclusión

Espero que sea evidente que la intercalación en SQL Server es crucial. Hemos definido qué impacto deja si realiza cambios en la intercalación en cualquier nivel en SQL Server. Realice siempre una planificación adecuada y pruebe primero las modificaciones en su entorno de ciclo de vida más bajo.

Estén atentos a mi próximo artículo, donde les mostraré un método paso a paso para cambiar la intercalación a nivel de servidor.

Comparta este artículo y dé su opinión, nos ayuda a mejorar.