列の照合順序の設定または変更Set or Change the Column Collation

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database

char 型、varchar 型、text 型、nchar 型、nvarchar 型、および ntext 型のデータのデータベース照合順序は、テーブルの列ごとに異なる照合順序を指定し、次のいずれかを使用することでオーバーライドできます。You can override the database collation for char, varchar, text, nchar, nvarchar, and ntext data by specifying a different collation for a specific column of a table and using one of the following:

  • 次の例で示すような、CREATE TABLEALTER TABLE の COLLATE 句。The COLLATE clause of CREATE TABLE and ALTER TABLE, as seen in the examples below.

    • インプレース変換。In-place conversion. 以下に定義されている既存のテーブルのいずれかについて検討してください。Consider one of the existing tables defined below:

      -- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used
      CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC);
      
      -- VARCHAR column is encoded the Latin code page and therefore is not Unicode capable
      CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI);
      

      列をインプレース変換して UTF-8 を使用するには、必要なデータ型、および UTF-8 が有効な照合順序を設定する ALTER COLUMN ステートメントを実行します。To convert the column in-place to use UTF-8, run an ALTER COLUMN statement that sets the required data type and a UTF-8 enabled collation:

      ALTER TABLE dbo.MyTable 
      ALTER COLUMN CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8
      

      このメソッドは、実装は簡単ですが、大規模なテーブルやビジーなアプリケーションでは、ブロッキング操作として問題となる可能性があります。This method is easy to implement, however it's a possibly blocking operation which may become an issue for large tables and busy applications.

    • コピーと置換。Copy and replace. 以下に定義されている既存のテーブルのいずれかについて検討してください。Consider one of the existing tables defined below:

      -- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used
      CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC);
      GO
      
      -- VARCHAR column is encoded using the Latin code page and therefore is not Unicode capable
      CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI);
      GO
      

      列を変換して UTF-8 を使用するには、新しいテーブルにデータをコピーします。このテーブルでは既に、ターゲット列は必要なデータ型であって、UTF-8 が有効な照合順序であり、古いテーブルを置き換えています。To convert the column to use UTF-8, copy the data to a new table where the target column is already the required data type and a UTF-8 enabled collation, and then replace the old table:

      CREATE TABLE dbo.MyTableNew (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8);
      GO
      INSERT INTO dbo.MyTableNew 
      SELECT * FROM dbo.MyTable;
      GO
      DROP TABLE dbo.MyTable;
      GO
      EXEC sp_rename 'dbo.MyTableNew', 'dbo.MyTable’;
      GO
      

      この方法は、インプレース変換よりはるかに高速ですが、多くの依存関係 (FK、PK、トリガー、DF) を持つ複雑なスキーマの処理や、データベースが使用されている場合は、テーブルの末尾の同期を計画的に行うことが必要です。This method is much faster than in-place conversion, but handling complex schemas with many dependencies (FKs, PKs, Triggers, DFs) and synching the tail of the table (if the database is in use) requires more planning.

    詳細については、「 Collation and Unicode Support」を参照してください。For more information, see Collation and Unicode Support.

  • SQL Server Management StudioSQL Server Management Studio.. 詳細については、「列の変更 (データベース エンジン)」を参照してください。For more information, see Modify Columns (Database Engine).

  • 管理オブジェクト (SMO) の Column.Collation SQL ServerSQL Server プロパティ。Using the Column.Collation property in SQL ServerSQL Server Management Objects (SMO).

次のいずれかから現在参照されている列は、照合順序を変更することはできません。You cannot change the collation of a column that is currently referenced by any one of the following:

  • 計算列A computed column
  • インデックスAn index
  • 自動的に生成された、または CREATE STATISTICS ステートメントによって生成された分布統計情報Distribution statistics, either generated automatically or by the CREATE STATISTICS statement
  • CHECK 制約A CHECK constraint
  • FOREIGN KEY 制約A FOREIGN KEY constraint

tempdbを操作する場合、 COLLATE 句に database_default オプションを指定することで、一時テーブルの列で、接続の現在のユーザー データベースでの既定の照合順序を tempdbの照合順序の代わりに使用するように指定することもできます。When you work with tempdb, the COLLATE clause includes a database_default option to specify that a column in a temporary table uses the collation default of the current user database for the connection instead of the collation of tempdb.

照合順序と text 列Collations and text Columns

データベースの既定の照合順序のコード ページと異なる照合順序が設定された text 列では、値の挿入と更新が可能です。You can insert or update values in a text column whose collation is different from the code page of the default collation of the database. SQL ServerSQL Server により、値がこの列の照合順序に暗黙的に変換されます。implicitly converts the values to the collation of the column.

照合順序と tempdbCollations and tempdb

tempdb データベースは、 SQL ServerSQL Server が起動されるたびに作成され、 model データベースと同じ既定の照合順序が設定されます。The tempdb database is built every time SQL ServerSQL Server is started and has the same default collation as the model database. これは、通常、インスタンスの既定の照合順序と同じになります。This is typically the same as the default collation of the instance. ユーザー データベースを作成して、 modelと異なる既定の照合順序を指定すると、そのユーザー データベースでは tempdbと異なる既定の照合順序が使用されます。If you create a user database and specify a different default collation than model, the user database has a different default collation than tempdb. 一時ストアド プロシージャや一時テーブルは、すべて tempdb内に作成および格納されます。All temporary stored procedures or temporary tables are created and stored in tempdb. その結果、一時テーブル内のすべての暗黙の列、および一時ストアド プロシージャ内で強制的に適用されるすべての既定の定数、変数、パラメーターでは、パーマネント テーブルやストアド プロシージャで作成される同等のオブジェクトとは異なる照合順序が指定されます。This means that all implicit columns in temporary tables and all coercible-default constants, variables, and parameters in temporary stored procedures have collations that are different from comparable objects created in permanent tables and stored procedures.

このため、ユーザー定義データベースとシステム データベース オブジェクトの照合順序の不一致による問題が発生する可能性があります。This could lead to problems with a mismatch in collations between user-defined databases and system database objects. たとえば、 SQL ServerSQL Server のインスタンスでは照合順序として Latin1_General_CS_AS が使用されていて、次のステートメントを実行するとします。For example, an instance of SQL ServerSQL Server uses the Latin1_General_CS_AS collation and you execute the following statements:

CREATE DATABASE TestDB COLLATE Estonian_CS_AS;  
USE TestDB;  
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  

このシステムでは、 tempdb データベースにコード ページ 1252 の Latin1_General_CS_AS 照合順序が使用され、 TestDBTestPermTab.Col1 にコード ページ 1257 の Estonian_CS_AS 照合順序が使用されることになります。In this system, the tempdb database uses the Latin1_General_CS_AS collation with code page 1252, and TestDB and TestPermTab.Col1 use the Estonian_CS_AS collation with code page 1257. 次に例を示します。For example:

USE TestDB;  
GO  
-- Create a temporary table with the same column declarations  
-- as TestPermTab  
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  
INSERT INTO #TestTempTab  
         SELECT * FROM TestPermTab;  
GO  

上記の例では、 tempdb データベースで Latin1_General_CS_AS 照合順序が使用され、 TestDBTestTab.Col1 では Estonian_CS_AS 照合順序が使用されます。With the previous example, the tempdb database uses the Latin1_General_CS_AS collation, and TestDB and TestTab.Col1 use the Estonian_CS_AS collation. 次に例を示します。For example:

SELECT * FROM TestPermTab AS a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1;  

tempdb ではサーバーの既定照合順序が使用され、 TestPermTab.Col1 では異なる照合順序が使用されるので、"Cannot resolve collation conflict between 'Latin1_General_CI_AS_KS_WS' and 'Estonian_CS_AS' in equal to operation. " (equal to 操作の 'Latin1_General_CI_AS_KS_WS' と 'Estonian_CS_AS' 間での照合順序の競合を解決できません。) というエラーが SQL Server から返されます。Because tempdb uses the default server collation and TestPermTab.Col1 uses a different collation, SQL Server returns this error: "Cannot resolve collation conflict between 'Latin1_General_CI_AS_KS_WS' and 'Estonian_CS_AS' in equal to operation."

このエラーを回避するには、次のいずれかを行います。To prevent the error, you can use one of the following alternatives:

  • 一時テーブル列で、 tempdbではなく、ユーザー データベースの既定の照合順序を使用するように指定します。Specify that the temporary table column use the default collation of the user database, not tempdb. この措置によって、システムで必要とされる場合に、一時テーブルを複数のデータベース内で同様の形式が設定されたテーブルと併用できます。This enables the temporary table to work with similarly formatted tables in multiple databases, if that is required of your system.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • 次のように、 #TestTempTab 列に正しい照合順序を指定します。Specify the correct collation for the #TestTempTab column:

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE Estonian_CS_AS  
       );  
    

参照See Also

サーバーの照合順序の設定または変更 Set or Change the Server Collation
データベースの照合順序の設定または変更 Set or Change the Database Collation
照合順序と Unicode のサポートCollation and Unicode Support