2008.08.01

濁点・半濁点を含む文字列の置換にはご注意を!!

先日、とあるテストの最中に見つけた、
"SQL Server"と"ある特殊文字"に関する問題を発見しましたので、
簡単にご紹介したいと思います。

↓↓↓↓↓↓サンプル↓↓↓↓↓↓↓↓

DECLARE @MOJI1 AS NCHAR(10)
SET @MOJI1 = 'ABCDE'

SELECT REPLACE(@MOJI1, 'ABC', 'XYZ') --'ABC'を'XYZ'に置換する

↑↑↑↑↑↑サンプル↑↑↑↑↑↑↑↑

上記SQLを"SQL Server 2000"にて実行します。

'ABCDE'の文字列の'ABC'を'XYZ'に置換するのですから、
得られる文字列は当然、'XYZDE'です。


しかし、ここで変換したい文字列の直後に、
濁点(゛)もしくは半濁点(゜)を入れると
置換することができません。

↓↓↓↓↓↓サンプル↓↓↓↓↓↓↓↓

DECLARE @MOJI1 AS NCHAR(10)
SET @MOJI1 = 'ABC゜DE'

SELECT REPLACE(@MOJI1, 'ABC', 'XYZ') --'ABC'を'XYZ'に置換する

↑↑↑↑↑↑サンプル↑↑↑↑↑↑↑↑

上記SQLを実行して得られる文字列は、
なぜか、'ABC゜DE'でした。

SQL Server 2005でも試してみても、同様の現象が起きます。

暇を見つけては、このような結果になる原因をいろいろと探っていますが、
未だに答えを見つけ出すことができません。

今後もし、原因が判明したらこの場で改めて
記事にさせていただこうと思います。

コメント (1)

これは古くて新しい話題ですね。
日本語の濁点/半濁点は SQLServerの内部では、とにかく直前の文字を修飾するもの(2文字で1セット)として
扱われているのではないでしょうか?
(Unicode のヨーロッパのアルファベットでの『アクセント』と同じ、重ね文字?)

ともあれ、次のようにすると期待した結果が得られます。
 SELECT REPLACE(@MOJI1 COLLATE Japanese_BIN, 'ABC', 'XYZ')

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
kobara