我知道现在已经很晚了,但这里发生了什么?我希望没有结果,因为分号在9之后出现在ASCII中:
select ascii(';') as semicolon, ascii('9') as nine where ';' < '9'
结果:
semicolon nine
59 57
答案 0 :(得分:6)
SQL Server中字符数据的排序和比较仅由二进制排序规则的代码点决定。
select ascii(';') as semicolon, ascii('9') as nine where ';' COLLATE Latin1_General_BIN < '9' COLLATE Latin1_General_BIN;
对于其他归类,比较规则和排序顺序是字典顺序(alphas之前的特殊字符),而不管底层二进制代码点序列如何。此外,Windows排序规则也遵循语言排序&#34;单词排序&#34;规则。例如:
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;
答案 1 :(得分:2)
在ISO字符串上使用<
运算符时,使用字典顺序(即您在字典中找到的顺序)进行比较。
http://en.wikipedia.org/wiki/Lexicographical_order
您需要使用ASCII()
子句中的WHERE
函数才能使您的案例成立。
SELECT ASCII(';') AS semicolon,
ASCII('9') AS nine
WHERE ASCII(';') < ASCII('9')