SQL Server 排序规则的影响

目录

  • SQL Server 排序规则

    • 影响

      • 效果演示
    • 更改数据库排序规则
      • 服务器级排序规则
      • 数据库级排序规则
      • 列级排序规则
      • 查询时指定规则
    • 建议
      • 使用 Unicode 数据类型
      • 使用二进制排序规则

[========]

SQL Server 排序规则

影响

排序规则会作用到 order、where、group 语句中。

默认中文 Windows 系统中安装的数据库使用的排序规则为:Chinese_PRC_CI_AS

选项 描述
区分大小写 (_CS) 区分大写字母和小写字母。 如果选择此项,排序时小写字母将在其对应的大写字母之前。 如果未选择此选项,排序规则将不区分大小写。 即 SQL Server 在排序时将大写字母和小写字母视为相同。 通过指定 _CI,可以显式选择不区分大小写。
区分重音 (_AS) 区分重音字符和非重音字符。 例如,“a”和“?”视为不同字符。 如果未选择此选项,则排序规则将不区分重音。 即 SQL Server 在排序时将字母的重音形式和非重音形式视为相同。 通过指定 _AI,可以显式选择不区分重音。
区分全半角 (_WS) 区分全角字符和半角字符。 如果未选择此选项,SQL Server 会在排序时将同一字符的全角和半角形式视为相同。 省略此选项是指定不区分全半角的唯一方法。

参考:
排序规则和 Unicode 支持
深入SQL Server 排序规则的原理

效果演示

表结构如下:

排序规则:

  • name Chinese_PRC_CS_AS_WS 大小写 重音 全半角
  • sss Chinese_PRC_CI_AI_WS 全半角

数据:

id,name,sss
1,123aaa啊,啊
2,123aaa啊(),啊aaa()
3,123aaa啊(),啊aaa()
4,123AAA啊(),啊AAA()

查询语句:

select * from dbo.Table_1
where name = '123aaa啊()'

select * from dbo.Table_1
where sss = '啊aaa()'

输出结果:

  1. 检查大小写、全半角,最后匹配到一条结果
  2. 检查全半角、不检查大小写,最后匹配到两条结果

更改数据库排序规则

排序规则级别:

  1. 服务器级排序规则
  2. 数据库级排序规则
  3. 列级排序规则
  4. 表达式级排序规则

服务器级排序规则

默认服务器排序规则是在 SQL Server 安装过程中设置的,由操作系统 (OS) 区域设置确定的默认排序规则。它将成为系统数据库和所有用户数据库的默认排序规则。

数据库级排序规则

创建或修改数据库时,可使用 CREATE DATABASE 或 ALTER DATABASE 语句的 COLLATE 子句指定默认数据库排序规则。 如果未指定排序规则,将为该数据库分配服务器排序规则。
除非更改服务器的排序规则,否则无法更改系统数据库的排序规则。

可以修改数据库的排序规则:

ALTER DATABASE myDB COLLATE Chinese_PRC_CS_AS_WS;

重要:更改数据库级排序规则不会影响现有列级排序规则或表达式级排序规则。

列级排序规则

当创建或更改表时,可使用 COLLATE 子句指定每个字符串列的排序规则。 如果不指定排序规则,将为列分配数据库的默认排序规则。

可使用如下的 ALTER TABLE 语句更改列的排序规则:

ALTER TABLE myTable ALTER COLUMN mycol NVARCHAR(10) COLLATE Chinese_PRC_CS_AS_WS;

查询时指定规则

查询条件后加 COLLATE语句,比如上面的第二个查询,这样只会查到一条结果。

select * from dbo.Table_1
where sss = '啊aaa()' collate Chinese_PRC_CS_AS_WS

建议

使用 Unicode 数据类型

请使用 Unicode 数据类型(nchar 、nvarchar 和 ntext ),而不是非 Unicode 数据类型(char 、varchar 和 text )。
Unicode 是一种将码位映射到字符的标准。由于它旨在涵盖全球所有语言的所有字符,因此无需使用不同代码页来处理不同字符集。支持国际化客户端的数据库应始终使用 Unicode 数据类型,而不应使用非 Unicode 数据类型。

备注
对于 Unicode 数据类型,数据库引擎最多可以使用 UCS-2 表示 65,535 个字符;或者,如果使用了附属字符,则可表示整个 Unicode 范围(?1,114,111 个字符)。 如需详细了解如何启用增补字符,请参阅 补充字符

使用二进制排序规则

二进制排序规则区分大小写。
对于非 Unicode数据类型,数据比较将基于 ANSI 代码页中定义的码位。
对于Unicode数据类型,数据比较将基于 Unicode 码位,不考虑区域设置。由于 Unicode 码位的比较相对简单,因此二进制排序规则有助于提高应用程序性能。

SQL Server 中有两种类型的二进制排序规则:

  • 在 BIN 排序规则中,仅首字符按照码位排序,其余字符根据其字节值排序。
  • 更新的 BIN2 排序规则中,所有字符根据其码位排序。

原文地址:https://www.cnblogs.com/jerviscui/p/11791129.html

时间: 2024-08-29 22:49:10

SQL Server 排序规则的影响的相关文章

sql server排序规则冲突

问题1: 解决: 数据库的排序规则不同,a表为临时表,用的是tempdb的排序规则,tempdb一般用的实例默认的排序规则. 而 b表用的是db_tank的排序规则,所以在两个表做字段匹配.计算等操作时会报错排序规则冲突. set @mdf=(SELECT dsize/1024 FROM #tf_driver a,db_tank..sysfiles b WHERE b.name='Db_Tank_Data' and a.driver COLLATE chinese_prc_ci_as =LEFT

SQL Server排序规则

在使用数据库的过程中,总会碰到一些特别的需求.有时候需要储存中文字符,区分大小写或者按照中文的比划顺序排序.这就涉及到了对数据库排列规则的选择. 我们一般可以选择数据库名称-->右键属性(Properties)-->功能(optiotion)-->排序方式(Collation)选择. * 由于没有中文版的数据库,中文翻译可能有误.   那这些不同的排序方式究竟有什么区别呢? 排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集. 如: Chinese_PRC_CI_AS 前半部

根据SQL Server排序规则创建顺序GUID

public static class GuidUtil { private static readonly long EpochMilliseconds = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks / 10000L; /// <summary> /// Creates a sequential GUID according to SQL Server's ordering rules. /// </summar

SQL Server 排序规则

1. 查看排序规则 select serverproperty('collation'); 2. 指定列的排序规则 alter table T2 add Y nvarchar(32) collate Chinese_PRC_CI_AS; go --------------------------------------------------- Chinese  --- “体字”    “中文”     的意思.  Chinese ”汉字 prc 指 People’s republic of C

修改SQL Server 排序规则 (未能排它地锁定数据库以执行该操作)

方法一: 重启一下mssqlserver的服务再做. 方法二: use mastergoalter database DBName set single_usergoalter database DBName COLLATE Chinese_PRC_CI_AS goalter database DBName set multi_usergo 原文地址:https://www.cnblogs.com/net5x/p/12430801.html

SQL Server 排序的时候使 null 值排在最后

最近遇到一个 SQL Server 排序的问题,以前也没了解过,然后这次碰到了. 才发现 SQL Server 排序的问题,在指定的排序列中 null 值会默认排在最前面,因为在 SQL Server 中 null 值默认为最小值. 后来问了一下万能的百度,找到了下面一种比较简单的处理方法. 首先建了一个表插入了一些测试数据. create table UserInfo ( UserInfoID int not null identity(1,1) primary key, User_No in

SQL Server统计信息偏差影响表联结方式案例浅析

原文:SQL Server统计信息偏差影响表联结方式案例浅析   我们知道数据库中的统计信息的准确性是非常重要的.它会影响执行计划.一直想写一篇关于统计信息影响执行计划的相关博客,但是都卡在如何构造一个合适的例子上,所以一直拖着没有写.巧合,最近在生产环境中遇到这么一个案例,下面对案例中的相关信息做了脱敏处理,有些中间步骤也省略了,只关注核心部分SQL.如下所示,同事反馈一个SQL语句执行很慢.   UPDATE  b SET     b.[Status] = '已扫描,未签收' ,      

SQL Server 排序函数 ROW_NUMBER和RANK 用法总结

下面的例子和SQL语句均在SQL Server 2008环境下运行通过,使用SQL Server自带的AdventureWorks数据库. 转载请注明此文原创自 CSDN TJVictor的专栏:http://blog.csdn.net/tjvictor/archive/2009/07/08/4331039.aspx 1.ROW_NUMBER()基本用法: SELECT  SalesOrderID,  CustomerID,  ROW_NUMBER() OVER (ORDER BY SalesO

添加SQL Server防火墙规则

一般来说,安装SQL Server的时候,都会自动给防火墙添加规则.如果没有添加,有可能会造成远程访问被堵塞,无法连接数据库. 对于默认实例,只需要在入站规则那里,加入server端的可执行文件即可.对于名命实例,则需要将SQL Server Browser也加入到规则里,增加方法与添加server端规则类似. 以下来自微软官方文档: 在使用动态端口时打开对 SQL Server 的访问1. 在 "开始" 菜单上,单击 "运行",键入 WF.msc,然后单击 &qu