小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


SQL ServerにUnicodeの文字列を格納する方法

はじめに

SQL ServerにShift_JISでは表現できない文字(Unicode文字)を格納すると???で文字化けすることがあります。これは、Unicode文字がデータベース既定のコードページに自動的に変換された結果起こります。

--鴎の字はしなかもめ
INSERT INTO TABLE ("ID", "NAME") VALUES ('1', '森鴎外');

このため、文字化けせずに正しくUnicodeの文字列を格納するには、以下の方法を用います。

Unicode文字列の前にNプレフィックスを付ける

以下のようにUnicode文字列の前にNというプレフィックスを付加します。

INSERT INTO TABLE ("ID", "NAME") VALUES ('1', N'森鴎外');

SQL Server で Unicode 文字列定数を扱う場合には、Unicode 文字列の前に大文字の N が必ず必要です。これは、SQL Server Books Online の「Unicode データの使用」で説明されています。"N" プレフィックスは、SQL-92 標準の National Language を意味し、必ず大文字にする必要があります。Unicode 文字列定数の前に N を付加しない場合、その文字列は、SQL Server によって、使用される前に現在のデータベースの Unicode 以外のコード ページに変換されます。
SQL Server で Unicode 文字列定数を処理するときは、すべての Unicode 文字列の前に N プレフィックスを付ける必要がある はてなブックマーク - SQL Server で Unicode 文字列定数を処理するときは、すべての Unicode 文字列の前に N プレフィックスを付ける必要がある

カラムのデータ型をUnicodeに対応したデータ型に変更する

char/varchar/textなどのデータ型をnchar/nvarchar/ntextに変更する必要があります。

SQL Server では次のデータ型が Unicode データをサポートします。

  • nchar
  • nvarchar
  • ntext

次の点を除き、nchar、nvarchar、ntext は、それぞれ char、varchar、text と同じです。

  • Unicode の方が広範な文字をサポートします。
  • Unicode 文字の方が格納に多くの記憶域を必要とします。
  • char 型列と varchar 型列の最大サイズは 8,000 文字であるのに対し、nchar 型列の最大サイズは 4,000 文字です。
  • nvarchar 型列の最大サイズは、2^31 バイトで、max 指定子を使用して指定します。nvarchar(max) の詳細については、「大きな値のデータ型の使用」を参照してください。
  • Unicode 定数は先頭に N を付けて指定します。つまり、「N'Unicode 文字列'」と指定します。
  • Unicode データは Unicode 標準により規定された文字セットを使用します。Unicode 列に使われる Unicode 照合順序は、大文字と小文字の区別、アクセントの区別、かなの区別、文字幅の区別、バイナリなどの属性を基に指定されます。

Unicode データの使用 はてなブックマーク - Unicode データの使用