2016-12-08 4 views
0

Ich mache ein paar Tests mit SQL Server-Datentypen. Ich habe den folgenden Code:Wie vergleicht SQL Server zwei NCHAR (1) Typ?

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), '哎'); 

Wenn er ausgeführt wird Ich habe:

enter image description here

Wenn ich den Bediener> zu < in der IF Anweisung ändern, und führen Sie wieder, ich habe:

enter image description here

Das Ergebnis scheint ein wenig verwirrend für mich. Kann mir bitte jemand erklären helfen?

BTW, ich bin auf SQL Server 2016 SP1.

+2

Sie fehlen das Präfix N vor Ihren Zeichenfolgenliteralen –

+0

@MartinSmith, Ja Martin, ich weiß, ich möchte nur wissen, wie SQL Server mit diesem Fall umgehen wird. –

+0

Es wird alles umwandeln? höchstwahrscheinlich. Abhängig von Ihrer Standard-Codepage und wenn sie diese Zeichen enthält. –

Antwort

3

In dem Code, wie Sie es geschrieben haben, haben Sie eine Möglichkeit weggelassen: Gleichheit der beiden Werte. Wie sich herausstellt, passiert das. Hier ist ein kleiner Code:

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

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

Die erste Auswahl zeigt, dass die beiden Werte haben in der Tat gleich, ist und die zweite zeigt, warum. Wenn Sie das Präfix N in Ihren Zeichenfolgenliteralen verwenden, sagt SQL, das sie als ASCII behandelt, dass "diese außerhalb des gültigen Bereichs für ASCII sind!". und ein buchstäbliches Fragezeichen zurückgeben.

Verwandte Themen