我的上下文是新的应用开发.我不担心与先前版本的sql Server的向后兼容性(即< = 2005).我非常希望存储代表全球各地语言的数据 - 不仅仅是拉丁语.我在网上找到了很少的帮助,建议我应该避免所有的“sql_”整理.这使我选择使用基于Windows语言环境的二进制或“非二进制”排序规则.
如果我使用二进制,我收集我应该使用“BIN2”.所以这是我的问题.如何确定我应该使用BIN2还是使用“Latin1_General_100_XX_XX_XX”?我的蜘蛛感告诉我,BIN2将提供“不太准确”的排序规则,但对于所有语言(和快速!)更为通用.我也怀疑二进制排序规则是区分大小写的,口音敏感的,和假名敏感的(是?).相比之下,我怀疑非二进制排序规则对于基于拉丁语言的语言最有效.
文档不支持我上面的说法,我正在做出有经验的猜测.但这是问题!为什么在线文档太薄了,选择留给猜测?即使是“sql Server 2008内部”一书也讨论了多种选择,而不解释为什么和何时选择二进制排序规则(与非二进制窗口排序规则相比较). Criminy!
解决方法
二进制排序规则很棘手,如果您打算支持文字搜索,那么最好使用非二进制文件.如果您调整了所有其他功能(第一种架构),并且在区分大小写和重音灵敏度是所需行为的情况下(例如密码哈希),则二进制文件很有可能获得一点点性能.二进制整理实际上是“更精确”的,因为它不考虑类似的文本.只有在机器上排序的排序才有效.
sql_ *排序规则和本机窗口之间只有一点区别.如果你没有受到兼容性的限制,那么去做本地的,因为他们是前进的方式.
整理决定了排序顺序和平等.你选择什么,最适合你的用户.据了解,您将使用unicode类型(如nvarchar)来支持国际文本.排序规则影响可以存储在非unicode列中的内容,这不会影响您.
真正重要的是,您避免在WHERE子句中混合排序规则,因为这是您不使用索引支付罚款的地方. Afaik没有任何银弹对齐来支持所有语言.您可以为大多数用户选择一个,也可以为每种语言使用不同的列进行本地化支持.
一个重要的是使服务器排序规则与数据库排序规则相同.如果您使用“CREATE TABLE #ttt …”创建的临时表作为临时表,则会使您的生活变得更加容易,并且您将遇到需要解决的排序规则冲突指定一个明确的排序规则.这也有性能影响.