小さい頃はエラ呼吸

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


SQLServerにおけるサロゲート ペアのサポートについて

SQLServer(2000および2005)がサロゲートペアの文字をサポートしているかどうかを調べてみました。

サロゲートペアについて

近年、Unicodeに組み込みたいという文字の要望がいろいろと増えてきました。結果的に従来の2バイト(65536文字)では文字が足りない状況になってしまったのです。そこで、解決策としてサロゲートペアという方法が導入されました。これは、「1文字=2バイト」の基本は維持しつつ、一部の文字については「1文字=4バイト」にする方法です。

 具体的には、従来のUnicodeでは未使用のだった0xD800〜0xDBFF(1024通り)を「上位サロゲート」、 0xDC00〜0xDFFF(1024通り)を「下位サロゲート」と規定し、「上位サロゲート+下位サロゲート」の4バイトで文字を表現する方法です。
サロゲートペア入門:CodeZine(コードジン)

SQLServer2000

SQLServer2000は、サロゲートペアの文字を1文字としてではなく、未定義の2文字として扱うようです。以下の説明では、情報を欠損なくデータベースに格納することは保証していますが、サロゲートペアを正しく処理できるかどうかについては、保証していないということが読み取れます。

SQL Server 7.0 および SQL Server 2000 は情報を損なうことなくサロゲート ペアを格納できますが、1 つの文字としてではなく、2 つの未定義の Unicode 文字としてサロゲート ペアを処理します。一般に、このようなアプリケーションを "サロゲート対応" または "サロゲート セーフ" と呼んでいます (ここで言う "セーフ" とは、サロゲート ペアを処理するための機能が備わっていなくても、データを格納できることを意味しています)。
Microsoft SQL Server 2000 のインターナショナル機能

このため、SQLServer2000では、サロゲートペアの文字を完全にサポートしているとは言えません。データの格納はできるが、検索や文字列操作をしようとした場合に、意図したとおりに動作しない可能があります。

つまり、SQL Server 2000もOracle9i Databaseも、技術的な仕様としてのサロゲートペアには対応できているのだ。

したがってサロゲートペアで表現される文字を格納できるし、何ら損なうことなく取り出すことは可能だ。しかしUnicode 3.2で定義されたJIS X 0213:2004の文字について、正しく理解して動作できるわけではない。より正確に述べれば、それらの文字については知り得ないバージョンだったために、未定義の文字コードを投入されたと認識するのである。
[ThinkIT] 第1回:Windows Vistaだと何が起こるのか (3/3)

SQLServer2005

SQLServer2005についてもSQLServer2000と同様です。格納はできるが、正しく処理できるとは限りません。

UCS-2 がサロゲートに対応していなくても、SQL Server 2000 および SQL Server 2005 はどちらもサロゲート ペアを格納できます。SQL Server は、1 つの文字ではなく 2 つの未定義の Unicode 文字としてサロゲート ペアを扱います。通常、このようなアプリケーションは "サロゲート ニュートラル" または "サロゲート セーフ" と呼ばれます。これは、データとやり取りする固有の機能を持ってはいないものの
Microsoft SQL Server 2005 のインターナショナル機能

SQLServer2005において、サロゲートペア文字を処理するための方法が、以下に記載されています。しかしながら、文字数の取得や文字列の切り取りを行う標準関数が対応していないため、完全にサポートしているとは言えない状況です。

1. データ型はnvarchar/nchar/ntextなど、先頭に「n」が付いたデータ型を使う
2. 文字列の先頭には大文字のNを付ける(Nプレフィックス)
3. 照合順序にはJapanese_90_BIN2などを指定する
4. len_s,right_s,left_sなどユーザ独自関数を実装して使う
[ThinkIT] 第3回:Microsoft SQL Server 2005で必要な対処(後編) (3/3)