【问题标题】:Locale aware sorting in sql serversql server 中的区域感知排序
【发布时间】:2011-12-08 06:32:51
【问题描述】:

我的基本问题是,我有使用数据库的不同语言环境的用户,我希望他们按其本机顺序对项目进行排序。

我的理解是它是这样工作的:

当我创建数据库时,我需要决定:

  • 字符编码(ISO、Unicode、代码页等):
    这限制了可以将哪些字符放入数据库

  • 物理存储(二进制、UTF-8、UCS16 字节序等):
    这是我相信数据库会处理的事情

  • 平等比较:
    这是必要的,因此唯一约束等在数据库中工作一致。通常我只需要决定不区分大小写(“a”=“A”)和重音(è=e)。 语言环境在这里重要吗?

所有这些东西(+默认排序顺序)都是通过为每个字段指定排序规则来设置的(其中默认值来自数据库,而数据库则从实例中获取默认值)

当与数据库建立连接时,登录的语言设置会指定日期和数字的显示方式等。

这就是我遇到麻烦的地方。 为什么排序顺序不依赖于连接的语言环境?我可以理解相等比较必须遵循字段规范但排序顺序?

我知道我可以做到ORDER BY [Name] COLLATE somecollation,但这样做有几个问题:

  1. 很容易忘记
  2. SQL 通常由工具/框架生成
  3. 我如何知道要指定什么排序规则?

您通常如何处理这个问题?客户端排序?

【问题讨论】:

  • 索引只能按一种物理顺序排序,因此按照您建议的方法,从连接的语言推断排序规则将意味着不同语言的不同执行计划具有不同程度的效率。至少一个明确的collate 子句(应该)表明您正在做一些对性能有影响的事情。
  • 好的,这是有道理的。我(错误地)假设基于文本的索引是基于哈希/基数的。无论如何,您不会为不同的用户获得不同的执行计划吗(除非您明确使用模式等)?
  • 实际上语言也被用作计划缓存键(从SELECT * FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_plan_attributes(plan_handle) 可以看出),因此不同的计划不会成为灾难性不同性能的潜在问题。
  • 您能否举例说明不区分大小写和重音处理因您所在地区而异的国家/地区?

标签: sql-server database-connection collation


【解决方案1】:

数据库排序规则告诉 SQL Server 如何根据语言通用处理字符。

语言环境在这里(“a”=“A”)和重音符号(è=e)很重要 这取决于您的排序规则设置。如果您的排序规则不区分大小写 (CI),则 ("a" = "A") 将被视为相同。如果您的排序规则不区分重音 (ai),则 (è = e) 将被视为相同

为什么排序顺序不取决于连接的语言环境? 因为 SQL Server 必须以某种方式在内部对数据进行排序,并且需要一些指导如何去做(整理)。

【讨论】:

    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多