【发布时间】:2011-12-08 06:32:51
【问题描述】:
我的基本问题是,我有使用数据库的不同语言环境的用户,我希望他们按其本机顺序对项目进行排序。
我的理解是它是这样工作的:
当我创建数据库时,我需要决定:
字符编码(ISO、Unicode、代码页等):
这限制了可以将哪些字符放入数据库物理存储(二进制、UTF-8、UCS16 字节序等):
这是我相信数据库会处理的事情平等比较:
这是必要的,因此唯一约束等在数据库中工作一致。通常我只需要决定不区分大小写(“a”=“A”)和重音(è=e)。 语言环境在这里重要吗?
所有这些东西(+默认排序顺序)都是通过为每个字段指定排序规则来设置的(其中默认值来自数据库,而数据库则从实例中获取默认值)
当与数据库建立连接时,登录的语言设置会指定日期和数字的显示方式等。
这就是我遇到麻烦的地方。 为什么排序顺序不依赖于连接的语言环境?我可以理解相等比较必须遵循字段规范但排序顺序?
我知道我可以做到ORDER BY [Name] COLLATE somecollation,但这样做有几个问题:
- 很容易忘记
- SQL 通常由工具/框架生成
- 我如何知道要指定什么排序规则?
您通常如何处理这个问题?客户端排序?
【问题讨论】:
-
索引只能按一种物理顺序排序,因此按照您建议的方法,从连接的语言推断排序规则将意味着不同语言的不同执行计划具有不同程度的效率。至少一个明确的
collate子句(应该)表明您正在做一些对性能有影响的事情。 -
好的,这是有道理的。我(错误地)假设基于文本的索引是基于哈希/基数的。无论如何,您不会为不同的用户获得不同的执行计划吗(除非您明确使用模式等)?
-
实际上语言也被用作计划缓存键(从
SELECT * FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_plan_attributes(plan_handle)可以看出),因此不同的计划不会成为灾难性不同性能的潜在问题。 -
您能否举例说明不区分大小写和重音处理因您所在地区而异的国家/地区?
标签: sql-server database-connection collation