はじめに
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 プレフィックスを付ける必要がある
カラムのデータ型を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 照合順序は、大文字と小文字の区別、アクセントの区別、かなの区別、文字幅の区別、バイナリなどの属性を基に指定されます。