2016-12-08 3 views
0

SQL Serverのデータ型でいくつかのテストを行っています。私が得た実行するとSQL Serverは2つのNCHAR(1)タイプをどのように比較しますか?

IF CONVERT(NCHAR(1), '啊') > CONVERT(NCHAR(1), '哎') 
    SELECT '>'; 
ELSE 
    SELECT '<'; 

SELECT '<' WHERE CONVERT(NCHAR(1), '啊') < CONVERT(NCHAR(1), '哎'); 
SELECT '>' WHERE CONVERT(NCHAR(1), '啊') > CONVERT(NCHAR(1), '哎'); 

:私は、次のコードを持っている

enter image description here

私はIF文で<にオペレータ>を変更して再度実行すると、私が得た:

enter image description here

結果は少し混乱しているようです。誰でも説明してくれますか?

私はSQL Server 2016 SP1を使用しています。

+2

文字列リテラルの前にN接頭辞がありません –

+0

@MartinSmith、はいマーティン、私はそれを知っています。 –

+0

それはすべてに変換されますか?最も可能性が高い。既定のコードページとそれらの文字が含まれているかどうかによって異なります。 –

答えて

3

あなたが書いたコードでは、2つの値が等しいことを示しています。それが判明すると、それは起こっていることです。少しコードがあります:

SELECT '=' WHERE CONVERT(NCHAR(1), '啊') = CONVERT(NCHAR(1), '哎'); 

SELECT UNICODE(CONVERT(NCHAR(1), '啊')), 
    UNICODE(CONVERT(NCHAR(1), '哎')), 
    NCHAR(UNICODE(CONVERT(NCHAR(1), '哎'))); 

最初の選択では、2つの値が実際に等しいと比較され、2つ目の理由が示されます。具体的には、文字列リテラルに接頭辞Nが存在しない場合、それらをASCIIとして扱うSQLは、「それらはASCIIの範囲外です!」と言います。リテラルの疑問符を返します。

関連する問題