技術的にサロゲートペアを扱えるのと、文字として認識して扱えるのとでは、意味合いが異なるということを述べた。文字列を比較条件とした検索処理を行う場合、その文字を正しく認識できていないと結果として正しくないものが戻される可能性がある。
では先ほど格納したデータに対して、実際に検索処理を行ってその結果を確認してみるとしよう。
曖昧検索を実行する。これは結果として「??」を格納した1行だけ戻るのが正しい。では下記のSQLを実行してみる。

(画像をクリックすると別ウィンドウに拡大図を表示します)
すると下記のような結果を返してくる。

(画像をクリックすると別ウィンドウに拡大図を表示します)
このとおり、条件に一致しないものも含めてというよりも、表に含まれる3行すべてが戻ってきてしまった。これは、サロゲートペアで表現された文字を、SQL Server 2005が認識できないので無視して処理を行うために起こる。今回の実験で使ったSQLの場合、サロゲートペアの文字を無視すると、条件は「%」だけが残るのですべてのデータにヒットしてしまうのだ。
では、曖昧検索ではなく、完全一致検索を行った場合はどうなるだろう。結果として「??」を格納した1行だけ戻るのが正しい。下記のSQLを実行しよう。

(画像をクリックすると別ウィンドウに拡大図を表示します)
その結果、下記のような答えが得られた。

(画像をクリックすると別ウィンドウに拡大図を表示します)
これはうまくいったようだ。ところがである。

(画像をクリックすると別ウィンドウに拡大図を表示します)
では次のように、もう1行サロゲートペアで扱う文字で構成された行を追加し、さきほどと同じSQLを実行してみる。

(画像をクリックすると別ウィンドウに拡大図を表示します)
すると上記のとおり、条件に一致していないはずの行まで検索結果として戻されるのである。サロゲートペアで扱う文字を含んでいる場合、曖昧検索に限らず、検索処理の動作は正しくないものとなってしまうのだ。
今回の現象は何が原因で起こっているのかさえ、正直なところはっきりと述べられない。このように、SQL Server 2005では、JIS X 0213:2004で追加された文字を格納できるが検索処理に問題を生じてしまうのである。
|