none
ncharの文字比較 RRS feed

  • 質問

  • sqlserver 2012 で以下のクエリで外字(私用領域)を含むutf-8文字列の抽出を試みたところ、

    select * from t where 漢字 like N'%[' + nchar(0xe000) + N'-' + nchar(0xf8ff) + N']%'

    cjk統合漢字領域の文字が含まれて返ってくることがわかりました。

    さらに

    select iif(nchar(0x940a)=nchar(0xe000),'o','x,')

    として結果が

    o

    となりした。

    範囲を外字の領域とcjk統合漢字に絞ってテストしたところ2249件のペアが抽出できました。

    文字コードはそれぞれ異なるのに、なぜこのような結果となるのでしょうか?

    環境による影響でしょうか?

    よろしくお願いします。

    2017年3月6日 7:13

回答

  • 照合順序の問題ですね。普通の照合順序では用領域(PUA)は重さが0になったりして、まっとうに比較されないのでしょう

    あくまで文字コードで勝負したいなら、たとえば、Japanese_90_bin2とか使ってください。もちろん、副作用(大文字小文字的が区別されだす、的な話)もあるのでそこはご注意。

    select iif(nchar(0x940a) COLLATE Japanese_90_bin2 =nchar(0xe000) COLLATE Japanese_90_bin2 ,'o','x,')

    => x,

    参考: https://blogs.msdn.microsoft.com/jpsql/2016/07/26/2-3/


    jzkey

    2017年3月6日 12:01

すべての返信

  • 照合順序の問題ですね。普通の照合順序では用領域(PUA)は重さが0になったりして、まっとうに比較されないのでしょう

    あくまで文字コードで勝負したいなら、たとえば、Japanese_90_bin2とか使ってください。もちろん、副作用(大文字小文字的が区別されだす、的な話)もあるのでそこはご注意。

    select iif(nchar(0x940a) COLLATE Japanese_90_bin2 =nchar(0xe000) COLLATE Japanese_90_bin2 ,'o','x,')

    => x,

    参考: https://blogs.msdn.microsoft.com/jpsql/2016/07/26/2-3/


    jzkey

    2017年3月6日 12:01
  • Japanese_bin2で期待通りに結果が返ってきました

    ありがとうございました。

    2017年3月7日 0:49