Impostare o cambiare le regole di confronto del database

Si applica a:SQL ServerIstanza gestita di SQL di Azure

Questo articolo descrive come impostare o modificare le regole di confronto del database usando SQL Server Management Studio (SSMS) o Transact-SQL. Se non viene specificata alcuna regola di confronto, vengono utilizzate le regole di confronto del server.

Limitazioni e restrizioni

  • Le regole di confronto solo Unicode di Windows possono essere usate solo con la clausola COLLATE per essere applicate ai tipi di dati nchar, nvarchar e ntext per i dati a livello di colonna e di espressione. Non è possibile utilizzarle con la clausola COLLATE per modificare le regole di confronto di un database o un'istanza del server.

  • Se le regole di confronto specificate o adottate dall'oggetto cui viene fatto riferimento utilizzano una tabella codici non supportata dai sistemi operativi Windows, nel motore di database viene visualizzato un errore.

  • È possibile specificare regole di confronto a livello di server in Istanza gestita di database SQL di Azure durante la creazione dell'istanza, ma non è possibile cambiarle in seguito. Altre informazioni in Impostare o modificare le regole di confronto del server.

Importante

L'istruzione ALTER DATABASE COLLATE non è supportata nel database SQL di Azure. Specificare le regole di confronto del database e le regole di confronto del catalogo quando si usa CREATE DATABASE.

Consigli

È possibile trovare i nomi delle regole di confronto supportate in Nome delle regole di confronto di Windows (Transact-SQL) e Nome delle regole di confronto di SQL Server (Transact-SQL) oppure è possibile usare la funzione di sistema sys.fn_helpcollations (Transact-SQL).

Quando si modificano le regole di confronto del database, vengono modificati i seguenti elementi:

  • Qualsiasi char, varchar, text, nchar, nvarcharo colonna ntext nelle tabelle di sistema viene impostata sulle nuove regole di confronto.

  • Tutti i parametri esistenti di tipo char, varchar, text, nchar, nvarcharo ntext , i valori scalari restituiti per le stored procedure e le funzioni definite dall'utente vengono modificati in base alle nuove regole di confronto.

  • I tipi di dati di sistema char, varchar, text, nchar, nvarcharo ntext e tutti i tipi di dati definiti dall'utente basati su tali tipi di dati di sistema vengono modificati in base alle nuove regole di confronto predefinite.

È possibile modificare le regole di confronto di qualsiasi nuovo oggetto creato in un database utente usando la clausola COLLATE dell'istruzione ALTER DATABASE. Questa istruzione non consente di modificare le regole di confronto delle colonne delle tabelle definite dall'utente esistenti. Per modificare le regole di confronto delle colonne, è necessario usare la clausola COLLATE dell'istruzione ALTER TABLE.

Importante

La modifica delle regole di confronto di un database o di singole colonne non modifica i dati sottostanti già archiviati nelle tabelle esistenti. A meno che l'applicazione non gestisca in modo esplicito la conversione e il confronto dei dati tra regole di confronto diverse, è consigliabile eseguire la transizione dei dati esistenti nel database alle nuove regole di confronto. Si evita così il rischio che le applicazioni modifichino erroneamente i dati, causando possibili risultati errati o una perdita di dati invisibile all'utente.

Quando si modificano le regole di confronto del database, solo le nuove tabelle erediteranno le nuove regole di confronto del database per impostazione predefinita. Sono disponibili diverse alternative per convertire i dati esistenti nelle nuove regole di confronto:

  • Convertire i dati sul posto. Per convertire le regole di confronto per una colonna in una tabella esistente, vedere Impostare o modificare le regole di confronto della colonna. Questa operazione è facile da implementare, ma può diventare un problema che causa un blocco per tabelle di grandi dimensioni e applicazioni a uso intensivo. Vedere l'esempio seguente per una conversione sul posto della colonna MyString per nuove regole di confronto:

    ALTER TABLE dbo.MyTable
        ALTER COLUMN MyString VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8;
    
  • Copiare i dati nelle nuove tabelle che usano le nuove regole di confronto e sostituire le tabelle originali nello stesso database. Creare una nuova tabella nel database corrente che erediterà le regole di confronto del database, copiare i dati tra la tabella precedente e la nuova tabella, eliminare la tabella originale e rinominare la nuova tabella con il nome della tabella originale. Si tratta di un'operazione più rapida rispetto a una conversione sul posto, ma può diventare complicata quando si gestiscono schemi complessi con dipendenze quali vincoli di chiave esterna, vincoli di chiave primaria e trigger. Richiede anche una sincronizzazione dei dati finale tra la tabella originale e quella nuova prima del termine finale, se i dati continuano a essere modificati dalle applicazioni. Vedere l'esempio seguente per una conversione con "copia e sostituzione" della colonna MyString per le nuove regole di confronto:

    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';
    
  • Copiare i dati in un nuovo database che usa le nuove regole di confronto e sostituire il database originale. Creare un nuovo database usando le nuove regole di confronto e trasferire i dati dal database originale tramite strumenti come Integration Services o l'Importazione/Esportazione guidata in SQL Server Management Studio. Questo è un approccio più semplice per gli schemi complessi. Richiede anche una sincronizzazione dei dati finale tra il database originale e quello nuovo prima del termine finale, se i dati continuano a essere modificati dalle applicazioni.

Autorizzazioni

Per creare un nuovo database è richiesta l'autorizzazione CREATE DATABASE nel database master, oppure CREATE ANY DATABASE, o l'autorizzazione ALTER ANY DATABASE.

Per modificare le regole di confronto di un database esistente è richiesta l'autorizzazione ALTER per il database.

Impostare o modificare le regole di confronto del database utilizzando SSMS

  1. In Esplora oggetti, connettersi a un'istanza del motore di database di SQL Server, espanderla e quindi espandere Database.

  2. Se si crea un nuovo database, fare clic con il pulsante destro del mouse su Database, quindi selezionare Nuovo database. Se non vuoi usare le regole di confronto predefinite, seleziona la pagina Opzioni e quindi le regole di confronto dall'elenco a discesa Regole di confronto.

    In alternativa, se il database esiste già, fare clic con il pulsante destro del mouse sul database desiderato e selezionare Proprietà. Selezionare la pagina Opzioni e selezionare le regole di confronto dall'elenco a discesa Regole di confronto.

  3. Al termine dell'operazione, selezionare OK.

Impostare le regole di confronto del database utilizzando Transact-SQL

  1. Connettersi al motore di database di .

  2. Nella barra Standard selezionare Nuova query.

  3. Copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui. In questo esempio viene mostrato come utilizzare la clausola COLLATE in CREATE DATABASE per specificare un nome delle regole di confronto. Nell'esempio viene creato l'elemento MyOptionsTest del database che utilizza le regole di confronto Latin1_General_100_CS_AS_SC . Dopo aver creato il database, eseguire l'istruzione SELECT per verificare l'impostazione.

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  

Modificare le regole di confronto del database utilizzando Transact-SQL

  1. Connettersi al motore di database di .

  2. Nella barra Standard selezionare Nuova query.

  3. Copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui. In questo esempio viene mostrato come utilizzare la clausola COLLATE in un'istruzione ALTER DATABASE per modificare il nome delle regole di confronto. Eseguire l'istruzione SELECT per verificare la modifica.

USE master;  
GO

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

Passaggi successivi

Altre informazioni sulle regole di confronto: