我们正在使用默认排序规则“Latin1_General_CI_AS”将数据库从旧的SQL Server 2k EE服务器迁移到新的SQL Server 2005&具有默认排序规则“SQL_Latin1_General_CP1_CI_AS”的2008服务器。没有国际字符需要我知道的Unicode,因此这两个代码页在实际应用中几乎相同。
主要的SQL Server DBA坚持认为,每个数据库(大部分由第三方应用程序构建)必须使用新的排序规则重建,然后才能迁移它们。
我知道自从SQL Server 2000以来,可以将各个数据库设置为具有与默认值不同的排序规则。 但是使用混合排序运行的真正后果是什么? One article from Microsoft表示共享tempdb的并发症(例如,可以轻松避免吗?)。
而且,或许更重要的是,如果我们确实需要在新服务器上支持多个排序规则,我们可以采取哪些措施来避免这些问题?
答案 0 :(得分:11)
服务器和数据库之间的不同排序规则的问题如前所述,临时表将默认使用服务器排序规则创建。这将使临时表和常规表之间的字符字段的任何比较失败。第三方应用程序的开发人员可以通过COLLATE database_default使用临时表的字符字段来避免这种情况。
create table #Tmp(Col1 nvarchar(50) COLLATE database_default)
我来自“其他”方面。我不是DBA,而是第三方软件开发人员,我认为构建我的应用程序以在数据库和服务器之间的排序规则不同的环境中工作是我的责任。我的责任是我的应用程序将使用区分大小写的排序规则。
答案 1 :(得分:5)
好的不是最好的答案,但是
你问道:“使用不同的排序规则运行会产生什么样的真正后果” 这可能很头疼。你在微软提到的这篇文章指出了它。根据我的个人经验,我遇到过这个问题并且不容易避免。 除非你测试得好,否则不合格的排序将会出现在计划外的地方。
您还问过“如果我们确实需要在新服务器上支持多个排序规则,我们可以采取哪些措施来避免这些问题?” 除了疯狂地测试之外,没有任何想法。
我真的希望你好运,这可能是一个普通的毛茸茸的问题,我不希望任何人。
答案 2 :(得分:2)
我的回答也不是很好,但是:
我们有多个订阅服务器与我们的主数据库同步,其中一些订阅服务器的排序规则不是发布者的。在启动复制时,我们继续收到“欢迎消息”,告诉我们“由于排序不相同,同步可能不会成功”。
虽然这个问题从未发生过,但我认为某处存在风险,我认为这种风险可能与参照完整性和\或字符字段设置的其他约束等因素有关。
啊:在T-SQl指令中也有这个大写\小写问题...检查一下here
@Michael和你的DBA是对的....限制风险,并使用独特的整理。