Establecer o cambiar la intercalación de base de datos

Se aplica a:SQL ServerAzure SQL Managed Instance

En este artículo se describe cómo establecer o cambiar la intercalación de base de datos usando SQL Server Management Studio (SSMS) o Transact-SQL. Si no se especifica ninguna intercalación, se utiliza la del servidor.

Limitaciones y restricciones

  • Las intercalaciones exclusivas de Unicode de Windows solo se pueden usar con la cláusula COLLATE para aplicar intercalaciones a los tipos de datos nchar, nvarchar y ntext de nivel de columna y de nivel de datos de expresión. No se pueden utilizar con la cláusula COLLATE para cambiar la intercalación de una instancia de base de datos o de servidor.

  • Si la intercalación especificada o la intercalación que usa el objeto al que se hace referencia utiliza una página de códigos no admitida en Windows, el Motor de base de datos muestra un error.

  • La intercalación de nivel de servidor en Instancia administrada de Azure SQL se puede especificar al crear la instancia y no se puede cambiar posteriormente. Obtenga más información en Configuración o cambio de la intercalación del servidor.

Importante

La instrucción ALTER DATABASE COLLATE no se admite en Azure SQL Database. Especifique la intercalación de base de datos y la intercalación del catálogo en el momento de CREATE DATABASE.

Recomendaciones

Puede encontrar los nombres de intercalación admitidos en Nombre de intercalación de Windows (Transact-SQL) y Nombre de intercalación de SQL Server (Transact-SQL), o bien puede usar la función del sistema sys.fn_helpcollations (Transact-SQL).

Al modificar la intercalación de la base de datos también se cambian los siguientes elementos:

  • Todas las columnas char, varchar, text, nchar, nvarcharo ntext de las tablas del sistema se cambian a la nueva intercalación.

  • Todos los valores devueltos escalares y parámetros char, varchar, text, nchar, nvarcharo ntext existentes para los procedimientos almacenados y las funciones definidas por el usuario se cambian a la nueva intercalación.

  • Los tipos de datos del sistema char, varchar, text, nchar, nvarcharo ntext y todos los tipos de datos definidos por el usuario basados en estos tipos de datos del sistema se cambian a la nueva intercalación predeterminada.

Para cambiar la intercalación de cualquier objeto nuevo creado en una base de datos de usuario, utilice la cláusula COLLATE de la instrucción ALTER DATABASE. Esta instrucción no modifica la intercalación de las columnas de ninguna de las tablas definidas por el usuario existentes. Para modificarlas, use la cláusula COLLATE de ALTER TABLE.

Importante

El hecho de cambiar la intercalación de una base de datos o columnas individuales no modifica los datos subyacentes ya almacenados en tablas existentes. A menos que la aplicación controle explícitamente la conversión de datos y la comparación entre las distintas intercalaciones, se recomienda trasladar los datos existentes en la base de datos a la última intercalación. Esto elimina el riesgo de que las aplicaciones puedan modificar incorrectamente los datos, lo que puede causar resultados erróneos o una pérdida de datos silenciosa.

Si se cambia una intercalación de base de datos, solo las tablas nuevas heredarán la última intercalación de base de datos de forma predeterminada. Hay varias alternativas para convertir los datos existentes de la última intercalación:

  • Convierta los datos en contexto. Para convertir la intercalación de una columna en una tabla existente, consulte Establecer o cambiar la intercalación de columnas. Es fácil implementar esta operación, pero puede convertirse en un problema de bloqueo en el caso de las tablas grandes y las aplicaciones ocupadas. Vea el ejemplo siguiente de una conversión en contexto de la columna MyString en una nueva intercalación:

    ALTER TABLE dbo.MyTable
        ALTER COLUMN MyString VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8;
    
  • Copie datos en tablas nuevas que utilicen la última intercalación y reemplace las tablas originales de la misma base de datos. Cree una nueva tabla en la base de datos actual que herede la intercalación de la base de datos y copie los datos entre la tabla anterior y la nueva. Ahora, quite la tabla original y cambie el nombre de la nueva por el nombre de la original. Esta operación es más rápida que una conversión en contexto, pero puede convertirse en un desafío al administrar esquemas complejos con dependencias como las restricciones de claves externas, las restricciones de claves principales y los desencadenadores. En caso de que las aplicaciones sigan cambiando los datos, también requeriría una sincronización de datos final entre la tabla original y la nueva antes del último cierre. Vea el ejemplo siguiente de una conversión de "copiar y reemplazar" de la columna MyString en una nueva intercalación:

    CREATE TABLE dbo.MyTable2 (MyString VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8); 
    
    INSERT INTO dbo.MyTable2 
    SELECT * FROM dbo.MyTable; 
    
    DROP TABLE dbo.MyTable; 
    
    EXEC sp_rename 'dbo.MyTable2', 'dbo.MyTable';
    
  • Copie los datos en una nueva base de datos que use la última intercalación y reemplace la base de datos original. Cree una nueva base de datos con la nueva intercalación y transfiera los datos de la base de datos original por medio de herramientas como Integration Services o el asistente para importación y exportación de SQL Server Management Studio. Este es un enfoque más sencillo en el caso de esquemas complejos. En caso de que las aplicaciones sigan cambiando los datos, también requeriría una sincronización de datos final entre la tabla original y la nueva base de datos antes del último cierre.

Permisos

Para crear una nueva base de datos, requiere CREATE DATABASE permiso en la master base de datos, o requiere CREATE ANY DATABASEel permiso , o ALTER ANY DATABASE .

Para cambiar la intercalación de una base de datos existente, requiere el permiso ALTER en la base de datos.

Establecer o cambiar la intercalación de base de datos mediante SSMS

  1. En el Explorador de objetos, conéctese a una instancia de Motor de base de datos de SQL Server, expándala y, a continuación, expanda Bases de datos.

  2. Si está creando una base de datos, haga clic con el botón derecho en Bases de datos y seleccione Nueva base de datos. Si no quiere la intercalación predeterminada, seleccione la página Opciones y elija una intercalación en la lista desplegable Intercalación.

    Como alternativa, si la base de datos ya existe, haga clic con el botón derecho en la base de datos que quiera y seleccione Propiedades. Seleccione la página Opciones y, después, seleccione una intercalación en la lista desplegable Intercalación.

  3. Después de terminar, seleccione Aceptar.

Establecer la intercalación de base de datos mediante Transact-SQL

  1. Conéctese con el Motor de base de datos.

  2. En la barra Estándar, seleccione Nueva consulta.

  3. Copie y pegue el ejemplo siguiente en la ventana de consulta y seleccione Ejecutar. En este ejemplo se muestra cómo usar la cláusula COLLATE en CREATE DATABASE para especificar un nombre de intercalación. En el ejemplo de crea la base de datos MyOptionsTest que utiliza la intercalación Latin1_General_100_CS_AS_SC . Después de crear la base de datos, ejecute la instrucción SELECT para comprobar la configuración.

USE master;  
GO

IF DB_ID (N'MyOptionsTest') IS NOT NULL  
    DROP DATABASE MyOptionsTest;  
GO

CREATE DATABASE MyOptionsTest  
    COLLATE Latin1_General_100_CS_AS_SC;  
GO  
  
SELECT name, collation_name  
FROM sys.databases  
WHERE name = N'MyOptionsTest';  
GO  

Cambiar la intercalación de base de datos mediante Transact-SQL

  1. Conéctese con el Motor de base de datos.

  2. En la barra Estándar, seleccione Nueva consulta.

  3. Copie y pegue el ejemplo siguiente en la ventana de consulta y seleccione Ejecutar. En este ejemplo se muestra cómo usar la cláusula COLLATE en una instrucción ALTER DATABASE para cambiar el nombre de la intercalación. Ejecute la instrucción SELECT para comprobar el cambio.

USE master;  
GO

ALTER DATABASE MyOptionsTest  
    COLLATE French_CI_AS ;  
GO  
  
SELECT name, collation_name  
FROM sys.databases  
WHERE name = N'MyOptionsTest';  
GO  

Pasos siguientes

Obtenga más información acerca de la intercalación: