国際化に対応した Transact-SQL ステートメントの記述

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

以下のガイドラインに従うと、Transact-SQL ステートメントを使用するデータベースやデータベース アプリケーションをある言語から別の言語に移行することが容易になり、複数の言語をサポートできます。

  • SQL Server 2019 (15.x) 以降および Azure SQL データベース では、次のいずれかを使用します。

    • charvarcharvarchar(max) の各データ型では UTF-8 対応の照合順序が使用され、データは UTF-8 を使用してエンコードされます。
    • ncharnvarcharnvarchar(max) の各データ型では補助文字 (SC) 対応の照合順序が使用され、データは UTF-16 を使用してエンコードされます。 SC 以外の照合順序を使用すると、データは UCS-2 を使用してエンコードされます。

    これによりコード ページ変換の問題を回避できます。 他の考慮事項については、「UTF-8 と UTF-16 でのストレージの相違点」をご覧ください。

  • SQL Server 2017 (14.x) までは、charvarcharvarchar(max) の各データ型を使用しているすべての個所をそれぞれ ncharnvarcharnvarchar(max) データ型に置き換えます。 補助文字 (SC) 対応の照合順序を使用する場合、データは UTF-16 を使用してエンコードされます。 SC 以外の照合順序を使用すると、データは UCS-2 を使用してエンコードされます。 これによりコード ページ変換の問題を回避できます。 詳細については、「 Collation and Unicode Support」を参照してください。

    重要

    text データ型は非推奨で、新しい開発作業では使用できません。 text データの varchar(max) への変換を検討してください。

  • 月単位または曜日単位で比較や操作を行う場合、名前の文字列ではない数字の日付要素を使用します。 言語設定が異なると、月や曜日の名前が異なります。 たとえば、DATENAME(MONTH,GETDATE()) は、言語の設定が英語 (U.S.) になっていれば May を返します。設定がドイツ語になっていれば Mai、フランス語になっていれば mai を返します。 代わりに、DATEPART のような関数を使用すると、月の名前の代わりに数字が返されます。 多くの場合、日付を数字で表記するよりも名前で表記する方がよりわかりやすくなるので、ユーザーに表示する結果セットを構築するときは、DATEPART 名を使用してください。 ただし、特定の言語の表示名に依存するロジックはコーディングしないでください。

  • 日付を比較する場合、または INSERT ステートメントまたは UPDATE ステートメントで日付を指定する場合は、どの言語設定でも同じ解釈が行われる制約を使用します。

    • ADO、OLE DB、および ODBC アプリケーションでは、以下に示す ODBC タイムスタンプ、日付、時刻のエスケープ句を使用する必要があります。

      { ts'yyyy-mm-ddhh:mm:ss [.fff] '} (例: { ts'1998-09-24 10:02:20'})

      { d'yyyy-mm-dd'} (例: { d'1998-09-24'})

      { t'hh:mm:ss'} (例: { t'10:02:20'})

    • 他の API、または Transact-SQL スクリプト、ストアド プロシージャ、トリガーを使うアプリケーションでは、区切られていない数字列を使う必要があります。 たとえば、 yyyymmdd には 19980924 を使用します。

    • 他の API、または Transact-SQL スクリプト、ストアド プロシージャ、トリガーを使うアプリケーションでは、time 型、date 型、smalldate 型、datetime 型、datetime2 型、datetimeoffset のデータ型と文字列データ型間の変換にはすべて、明示的なスタイル パラメーターを指定して CONVERT ステートメントを使う必要があります。 たとえば、次のステートメントは、すべての言語または日付形式の接続設定で同じように解釈されます。

      SELECT *  
      FROM AdventureWorks2022.Sales.SalesOrderHeader  
      WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)  
      

関連項目

CAST および CONVERT (Transact-SQL)
DATEPART (Transact-SQL)
照合順序と Unicode のサポート