2015-03-20 18 views
5

Wiem, że jest późno, ale co tu się dzieje? będę oczekiwać żadnych wyników średnik przychodzi po 9 w ASCII:Porównanie stringów serwera SQL

select ascii(';') as semicolon, ascii('9') as nine where ';' < '9' 

Wyniki:

semicolon nine 
59   57 

Odpowiedz

6

Sortowanie i porównywanie danych znakowych w SQL Server jest określona przez punkty kodowe tylko z sortowania binarnych.

select ascii(';') as semicolon, ascii('9') as nine where ';' COLLATE Latin1_General_BIN < '9' COLLATE Latin1_General_BIN; 

Z innych sortowania, zasad porównywania i sortowania kolejność jest zamówienie słowniku (znaki specjalne przed alfa), niezależnie od podstawowej sekwencji binarnej punkcie kodowym. Ponadto, sortowanie w systemie Windows stosuje się także do lingwistycznych reguł sortowania słów. Na przykład:

SELECT 1 WHERE 'coop' COLLATE SQL_Latin1_General_CP1_CI_AS < 'co-op' COLLATE SQL_Latin1_General_CP1_CI_AS; 
SELECT 1 WHERE 'coop' COLLATE Latin1_General_CI_AS < 'co-op' COLLATE Latin1_General_CI_AS; 
+0

Dzięki Dan, wiedziałem, że będzie to coś tak ezoterycznego. Krwawe mylenie i zaciemnianie, jeśli mnie pytasz! –

+0

@ JonHanlon, tak to jest mylące. Dobrze, że nie pytałeś też o strony językowe i kodowe :-) –

2

Przy użyciu operatora < na sznurkach ISO, porównanie jest dokonywane za pomocą porządku leksykograficznego (czyli zamówienia będzie można znaleźć w słowniku.)

http://en.wikipedia.org/wiki/Lexicographical_order

trzeba by użyć funkcji ASCII() w th e WHERE klauzuli, aby Twoja sprawa była prawdziwa.

SELECT ASCII(';') AS semicolon, 
     ASCII('9') AS nine 
WHERE ASCII(';') < ASCII('9') 

http://sqlfiddle.com/#!6/9eecb/1264

+0

ascii() miało pokazać, że średnik jest w rzeczywistości większy niż 9. Po prostu chcę wiedzieć, dlaczego "; Wartość '9' jest prawdziwa. –

+0

Tak, ale dlaczego porównywanie łańcuchów daje inny wynik? –

+0

Podczas używania operatora '<' na łańcuchach ISO, porównanie jest wykonywane przy użyciu kolejności leksykograficznej (tj. Kolejność, którą można znaleźć w słowniku). Zaktualizowałem moją odpowiedź, aby uwzględnić te informacje. http://pl.wikipedia.org/wiki/Lexicographical_order – Drenmi