kry*_*tah 11 sql-server best-practices collation
有两个原因促使我提出这个问题:
tSQLt当存在具有非默认排序规则的列时
,T-SQL 测试框架 tSQLt 将其视为“高严重性”问题。测试的作者声明如下:
我并不是建议每个字符串列都应该有一个与数据库的默认排序规则相匹配的排序规则。相反,我建议当它不同时,应该有一个很好的理由。
然而,如前所述,失败测试的严重性被认为是高的。
八达通部署
在配置八达通部署服务器时,在八达通服务器实例的初始化过程中,设置失败并出现致命错误。与错误消息相关的文章并没有解释为什么这是一项要求,而只是说明它将成为未来部署的一项要求,包括 Octopus 3.8 版。
附带说明一下,RedGate 的 CI 工具包DLM 自动化套件支持具有不同排序规则的部署而不会出现投诉。
将所有列排序规则保留为数据库默认值的建议对我来说更像是指南或最佳实践。为什么有人认为这是一个严重的错误?
Sol*_*zky 19
将所有列排序规则保留为数据库默认值的建议对我来说更像是指南或最佳实践。
你在这里完全正确。
为什么有人认为这是一个严重的错误?
出于同样的原因,您会经常听到/读到“您永远不应该使用:”
GOTO
声明WITH (NOLOCK)
某些功能/选项/技术比其他功能/选项/技术更复杂,并且通常需要用户更多的知识,因为使用它时遇到问题的机会比没有任何问题的机会要大得多。因此,更容易为一般人群制定针对此类事情的通用规则。其实在工作中写《编码标准》的时候,我总会有个规矩千万不要使用 CURSOR,但我自己使用它们,因为我知道“何时”使用它们以及“如何”有效地使用它们。但是不应该期望只是偶尔编写查询的人知道这一点。这也类似于“除非您完全知道自己在做什么,否则不要编辑注册表”,或者我们作为父母为我们的(非常年幼的)孩子制定的规则,我们需要告诉他们不要仅仅因为他们是无法解决何时可以做某件事或如何去做这件事的复杂性。
在排序规则的情况下,这是一个非常复杂和令人困惑的主题,您可能会遇到硬错误(这些是一个问题,但问题不大,因为它们很明显,因此很容易修复)和“奇怪”难以解释为什么事情会按照它们的方式行事的行为(为什么某些项目被过滤或未过滤,超出预期,或者为什么排序的行为超出预期)。可悲的是,似乎存在大量错误信息,这进一步加剧了大众的混乱。我实际上正在开展一个项目,以极大地增加对排序规则和编码等的一般知识,并希望抵消错误信息和神话,但尚未准备好发布它(完成后我将通过链接对其进行更新)。
对于整理,您需要使用对业务案例最有意义的内容。不在表或数据库中混合排序规则的概念是默认方法,但是如果您查看用于系统目录视图的各个列的排序规则,您会注意到使用了各种排序规则。所以我同意问题中的主要引述,如果排序规则会有所不同,它应该是故意的,但它本身没有任何问题。
关于这个问题(强调):
配置 Octopus 部署服务器时,在 OctopusServer 实例初始化期间设置失败并出现致命错误。与错误消息相关的文章没有解释为什么这是一个要求
我检查了链接的文档页面,它确实解释了为什么它是一个要求。我已从以下文档中复制了相关信息:
您必须确保您也更改了八达通数据库中所有对象的排序规则,否则在八达通版本升级期间修改数据库时可能会出现错误。创建的新对象将使用更新的排序规则,并且当尝试(例如)使用原始排序规则在这些对象和现有对象之间执行 SQL 连接时,可能会发生排序规则不匹配错误。
他们说他们的代码,在 Octopus 数据库中,在字符串列之间有 JOIN,并且可能在未来的升级中引入新代码,在新的字符串列上有额外的 JOIN 。未为新字符串列指定新列,通过CREATE TABLE
或关键字。没有相同排序规则的字符串列之间的 JOIN 将生成排序规则不匹配错误。他们似乎还允许用户选择他们自己的排序规则(可能是为了适应不同的语言环境),因为他们在顶部说唯一的要求是排序规则不区分大小写。由于不能保证其代码所在的数据库的排序规则始终相同,因此他们不能使用ALTER TABLE ... ADD
)将被分配数据库的默认排序规则,如果COLLATE
COLLATE
关键字在所有新字符串列中强制使用相同的排序规则(好吧,技术上可以,但这需要动态 SQL,因此在生成更新脚本时不容易处理)。如果他们能够使用COLLATE
关键字,那么他们就可以避免让数据库的默认排序规则与字符串列不同。这将避免硬“排序规则不匹配”错误,但仍会保留涉及这些字符串列之一和字符串文字或变量的比较操作的可能性,从而导致“奇数”行为,因为它将使用列的排序规则而不是数据库的整理。当然,这很可能是预期的行为。但由于这是一个 3rd 方应用程序,行为应该是他们想要的,而不是在 a) 用户想要(或不反对)和 b) 用户认为错误(然后浪费供应商的支持时间在疯狂追逐和/或关于他们的软件如何错误的博客上)。
Yar*_*lav 10
一句话简介:COLLATION 定义了排序和比较。
因此,排序规则决定了 SQL Server 用于比较和排序字符数据的规则。这些规则是语言/区域感知的,也可能对大小写、重音、假名和宽度敏感。排序规则后缀标识字典规则(不区分)敏感度:_CS(区分大小写)、_CI(不区分大小写)、_AS(区分重音)、_AI(不区分重音)和 _KS(区分假名)。由后缀 _BIN(二进制)和 _BIN2(二进制代码点)标识的二进制排序规则在所有方面都是敏感的。
不同的排序规则肯定需要解决方法来避免“无法解决排序规则冲突”错误,并且由于已知的不可 sargable 表达式可能会降低性能。处理不同的排序规则可能是一场噩梦(一直在那里),所以这就是为什么建议选择一个并坚持下去的原因。
更多参考:
归档时间: |
|
查看次数: |
2223 次 |
最近记录: |