我正在英国开发一个数据库(数据库1),其默认排序规则为:Latin1_General_CI_AS。还有一个由美国公司(database2)创建的数据库,其默认排序规则为SQL_Latin1_General_CP1_CI_AS。我有时会运行这样的查询:
select Person1.* from database1.Person as Person1
inner join database2.Person as Person2 on Person1.ID=Person2.ID
ID是varchar。这是错误:
**Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.**
我通过这样做来解决这个问题:
select Person1.* from database1.Person as Person1
inner join database2.Person as Person2 on Person1.ID=Person2.ID collate Latin1_General_CI_AS
我在查询中指定的排序规则是否重要?
答案 0 :(得分:0)
如果在较大的表上强制进行排序规则,性能可能会成为问题,因为SQL Server无法使用其索引。
此外,您可能会得到错误的结果。如果一个排序规则区分大小写且其他排序不区分大小写,则选择不同的排序规则可能会得到不同的结果。
答案 1 :(得分:0)
如果列是varchar
(不是nvarchar
),那么它们不会受到归类影响的数据值,并且无论您选择哪个都无关紧要。如果列为nvarchar
,则可能存在差异,以便比较更具异国情调的角色,并且性能可能会有所不同。
就个人而言,如果表现不是什么大问题,我只会使用
collate database_default
易于编写,因此您的代码更具弹性。
如果性能存在问题,请阅读this article并在查询计划开启的同时尝试查询,并查看相关查询计划。