合 MSSQL中的大小写和排序规则问题
Tags: MSSQLSQL Server排序规则大小写敏感
现象
如下的SQL语句有的时候报错,有的时候正常:
1 | SELECT TABLE_CATALOG, TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.tables where TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA='dbo'; |
原因:数据库大小写敏感性问题,即排序规则问题。
排序规则
在 SQL Server 中,排序规则(Collation)定义了用于比较和排序字符串数据的规则和规范。它影响字符串的排序顺序、大小写敏感性、重音符号和特殊字符的处理方式等。
SQL Server 的排序规则由一组属性定义,包括以下方面:
- 排序规则名称:每个排序规则都有一个唯一的名称,例如 "Latin1_General_CI_AS"。
- 排序规则标识符(LCID):用于标识特定排序规则的整数值。
- 大小写敏感性:定义了字符串比较时是否区分大小写。CI 表示不区分大小写,CS 表示区分大小写。
- 重音符号敏感性:定义了字符串比较时是否区分重音符号。AI 表示不区分重音符号,AS 表示区分重音符号。
- 宽字符敏感性:定义了对宽字符(例如日语、韩语、中文等)的排序方式。AI 表示不区分宽字符,AS 表示区分宽字符。
- 字符集:定义了排序规则使用的字符集(例如 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 提供了许多常见的排序规则,以满足不同语言和区域的排序需求。以下是一些常见的排序规则的示例:
- Latin1_General_CI_AS:不区分大小写,不区分重音符号的拉丁字符集排序规则。适用于多种语言和地区。
- SQL_Latin1_General_CP1_CI_AS:不区分大小写,不区分重音符号的拉丁字符集排序规则。与 Latin1_General_CI_AS 类似,但对某些特殊字符的排序处理略有不同。
- Chinese_PRC_CI_AS:不区分大小写的中文字符集排序规则。适用于简体中文排序。
- Chinese_Taiwan_Stroke_CI_AS:不区分大小写的中文字符集排序规则,基于汉字的笔画顺序。适用于繁体中文排序。
- Japanese_CI_AS:不区分大小写的日语字符集排序规则。适用于日语排序。
- Korean_90_CI_AS:不区分大小写的韩语字符集排序规则。适用于韩语排序。
- Arabic_CI_AS:不区分大小写的阿拉伯字符集排序规则。适用于阿拉伯语排序。
- 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)。
- 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),这意味着在比较和排序时,会区分不同音调的字符。
- Chinese_PRC_CI_AS:
- "Chinese_PRC_CI_AS"是一种针对简体中文的排序规则。
- "Chinese_PRC"表示针对中华人民共和国(People's Republic of China)的排序规则。
- "CI"表示大小写不敏感(case-insensitive),这意味着在比较和排序时,不区分大小写。
- "AS"表示音调敏感(accent-sensitive),这意味着在比较和排序时,会区分不同音调的字符。
区别: