先日、とあるテストの最中に見つけた、
"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')
投稿者: 市川 | 2008年8月 4日 14:25