出于演示目的,我有一个示例表,其中有一varchar
列名为numberstring
:
-4
32
0
4
16
8
-8
1024
在选择 usingORDER BY numberstring
时,我发现不同的用户得到不同的结果。
一些得到:
-4, -8, 0, 1024, 16, 32, 4, 8
而有些人得到:
0, 1024, 16, 32, -4, 4, -8, 8
不知何故,第二个结果似乎忽略了减号,即使数据以其他方式排序为字符串数据。
据我所知,底层服务器是 Microsoft SQL Server express 的标准安装,没有任何特殊选项。该版本是最近几年的版本,但使用相同版本的用户仍然报告不同的结果。
设置中是否存在影响结果的内容,如何从 SSMS 中查看?
据我所知,数据库服务器和 SSMS 是在澳大利亚设置的,只有默认值。数据类型是varchar(max)
。
字符串排序顺序由排序规则确定。不同位置的用户期望数据以不同的方式排序,并且整理将这些期望编码。
如果未明确指定,列的排序规则是从数据库/实例级别继承的。安装 SQL Server 会设置不同的实例级排序规则,具体取决于用户选择的内容或从 Windows 语言设置推断的默认值。从文档中:
您的一些用户可能默认使用向后兼容的 SQL_Latin1_General_CP1_CI_AS 排序规则,而世界其他地方的其他用户可能使用类似 Latin1_General_100_CI_AS 的排序规则:
db<>小提琴
这可能是因为您的一些用户将其 Windows 区域设置设置为English (United States)而其他用户设置为 English (Australia)。
在脚本中解决此问题的一种方法是在语句(文档)中使用可选
COLLATE
子句。CREATE DATABASE
您可以使用以下命令查看每个数据库的默认排序规则:
如果返回 a
NULL
,则可能是数据库不在线或由于(对于 SQL Server Express 的AUTO_CLOSE
默认设置)而关闭。ON
请参阅. _sys.databases
实例级排序规则:
较旧的 SQL_* 排序规则对 Unicode 和非 Unicode 数据使用不同的规则: