MSSQL中的大小写和排序规则问题

0    116    1

Tags:

👉 本文共约3284个字,系统预计阅读时间或需13分钟。

现象

如下的SQL语句有的时候报错,有的时候正常:

原因:数据库大小写敏感性问题,即排序规则问题。

排序规则

在 SQL Server 中,排序规则(Collation)定义了用于比较和排序字符串数据的规则和规范。它影响字符串的排序顺序、大小写敏感性、重音符号和特殊字符的处理方式等。

SQL Server 的排序规则由一组属性定义,包括以下方面:

  1. 排序规则名称:每个排序规则都有一个唯一的名称,例如 "Latin1_General_CI_AS"。
  2. 排序规则标识符(LCID):用于标识特定排序规则的整数值。
  3. 大小写敏感性:定义了字符串比较时是否区分大小写。CI 表示不区分大小写,CS 表示区分大小写。
  4. 重音符号敏感性:定义了字符串比较时是否区分重音符号。AI 表示不区分重音符号,AS 表示区分重音符号。
  5. 宽字符敏感性:定义了对宽字符(例如日语、韩语、中文等)的排序方式。AI 表示不区分宽字符,AS 表示区分宽字符。
  6. 字符集:定义了排序规则使用的字符集(例如 Latin1_General 使用的是拉丁字符集)。

SQL Server 提供了一系列预定义的排序规则,每个排序规则具有不同的特性和适用场景。常见的排序规则包括:

  • Latin1_General_CI_AS:不区分大小写,不区分重音符号,不区分宽字符的拉丁字符集排序规则。
  • SQL_Latin1_General_CP1_CI_AS:不区分大小写,不区分重音符号的拉丁字符集排序规则。
  • Chinese_PRC_CI_AS:不区分大小写的中文字符集排序规则。
  • Japanese_CI_AS:不区分大小写的日语字符集排序规则。

除了预定义的排序规则,SQL Server 还支持自定义排序规则。你可以根据自己的需求创建自定义排序规则,并根据需要指定各种属性。

排序规则在数据库中的应用非常重要,它们直接影响到字符串比较和排序的结果。在查询中使用 ORDER BY 子句时,排序规则决定了字符串的排序顺序。此外,排序规则还可以影响字符串的比较操作、索引的创建和查询优化等方面。

SQL Server 提供了许多常见的排序规则,以满足不同语言和区域的排序需求。以下是一些常见的排序规则的示例:

  1. Latin1_General_CI_AS:不区分大小写,不区分重音符号的拉丁字符集排序规则。适用于多种语言和地区。
  2. SQL_Latin1_General_CP1_CI_AS:不区分大小写,不区分重音符号的拉丁字符集排序规则。与 Latin1_General_CI_AS 类似,但对某些特殊字符的排序处理略有不同。
  3. Chinese_PRC_CI_AS:不区分大小写的中文字符集排序规则。适用于简体中文排序。
  4. Chinese_Taiwan_Stroke_CI_AS:不区分大小写的中文字符集排序规则,基于汉字的笔画顺序。适用于繁体中文排序。
  5. Japanese_CI_AS:不区分大小写的日语字符集排序规则。适用于日语排序。
  6. Korean_90_CI_AS:不区分大小写的韩语字符集排序规则。适用于韩语排序。
  7. Arabic_CI_AS:不区分大小写的阿拉伯字符集排序规则。适用于阿拉伯语排序。
  8. Hebrew_CI_AS:不区分大小写的希伯来字符集排序规则。适用于希伯来语排序。

除了上述示例外,SQL Server 还提供了其他许多排序规则,以覆盖更多的语言和区域。

你可以通过查询 sys.fn_helpcollations() 系统函数来获取 SQL Server 实例中可用的所有排序规则列表,约有3800多种排序规则。

在选择排序规则时,应根据特定的语言、地区和排序需求进行选择,以确保正确的字符比较和排序结果。

"SQL_Latin1_General_CP1_CI_AS"和"Chinese_PRC_CI_AS"的区别

"SQL_Latin1_General_CP1_CI_AS"和"Chinese_PRC_CI_AS"是两种不同的数据库排序规则(collation)。

  1. SQL_Latin1_General_CP1_CI_AS:
    • "SQL_Latin1_General_CP1_CI_AS"是一种基于Latin1字符集的排序规则。
    • "CP1"表示Code Page 1,指的是Windows默认的字符编码(Code Page),它支持大部分西欧语言的字符。
    • "CI"表示大小写不敏感(case-insensitive),这意味着在比较和排序时,不区分大小写。
    • "AS"表示音调敏感(accent-sensitive),这意味着在比较和排序时,会区分不同音调的字符。
  2. Chinese_PRC_CI_AS:
    • "Chinese_PRC_CI_AS"是一种针对简体中文的排序规则。
    • "Chinese_PRC"表示针对中华人民共和国(People's Republic of China)的排序规则。
    • "CI"表示大小写不敏感(case-insensitive),这意味着在比较和排序时,不区分大小写。
    • "AS"表示音调敏感(accent-sensitive),这意味着在比较和排序时,会区分不同音调的字符。

区别:

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复