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

適用対象:yesSQL Server Analytics Platform System (PDW) YesYesAzure SQL Database Azure SQL Managed Instance yesyesAzure Synapse Analytics (すべてのサポートされているバージョン)

Transact-SQL ステートメントを使用するデータベースとデータベース アプリケーションは、次のガイドラインに従う場合、ある言語から別の言語への移植性が高くなるか、複数の言語をサポートします。

  • 2019 SQL Server (15.x) および 2019 年 15 月Azure SQL Database、次のいずれかを使用します。

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

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

  • 最大 SQL Server 2017 (14.x) まで、charvarchar、varchar(max) データ型のすべての使用を ncharnvarcharおよび nvarchar(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'yyyymmddhh:mm:ss [.fff] '} (例: { ts'1998-09-24 10:02:20'})

      { d'yyyymmdd'} (例: { d'1998-09-24'})

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

    • 他の API または Transact-SQL スクリプト、ストアド プロシージャ、およびトリガーを使用するアプリケーションでは、一部の数値文字列を使用する必要があります。 たとえば、 yyyymmdd には 19980924 を使用します。

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

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

関連項目

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