SQL Server 中大小写区分的处理。

默认情况下,SQL Server 里面是不区分大小写的:

E:\>sqlcmd -S "localhost\SQLEXPRESS"
1> use test
2> go
已将数据库上下文更改为 'Test'。

-- 建立一个 tab 的测试表, 表名称为全部小写
1> CREATE TABLE [tab] ( id int )
2> go

1> select * from tab
2> go
id
-----------

(0 行受影响)
1> select * from Tab
2> go
id
-----------

(0 行受影响)

上面可以看出,默认情况下,
select * from tab 与 select * from Tab 是一样的。
因为不区分大小写

下面设置  test 数据库,让其区分大小写
alter database test  COLLATE  Chinese_PRC_CS_AS

1> alter database test  COLLATE  Chinese_PRC_CS_AS
2> go

1> select * from tab
2> go
id
-----------

(0 行受影响)
1> select * from Tab
2> go
消息 208,级别 16,状态 1,服务器 WANGZHIQING\SQLEXPRESS,第 1 行
对象名 'Tab' 无效。

设置数据库区分大小写以后,可以看到
select * from Tab 的时候, SQL Server 无法识别 "Tab" 这个表了
因为区分大小写了。

下面恢复 test 数据库的设置,让其不区分大小写
alter database test COLLATE Chinese_PRC_CI_AS

1> alter database test COLLATE Chinese_PRC_CI_AS
2> go

1> select * from tab
2> go
id
-----------

(0 行受影响)
1> select * from Tab
2> go
id
-----------

(0 行受影响)

恩,一切又恢复正常了。

上面是 关于 SQL 语句的区分大小写

----------
--分割线--
----------

下面是 关于 数据内容的区分大小写
首先删除前面的测试表

1> drop table [tab]
2> go

重建一个,因为前面的表,只有个 int 字段,没法测大小写。
CREATE TABLE [tab] (
  id  INT  IDENTITY(1,1),
  val NVARCHAR(10)
);
go

INSERT INTO [tab]
  SELECT 'ABC123' UNION ALL
  SELECT 'abc234' UNION ALL
  SELECT 'Abc345' UNION ALL
  SELECT 'aBC456' UNION ALL
  SELECT 'aBc567'
go

1> SELECT
2>   *
3> FROM
4>   tab
5> WHERE
6>  val LIKE 'a%'
7> go
id          val
----------- ----------
          1 ABC123
          2 abc234
          3 Abc345
          4 aBC456
          5 aBc567

(5 行受影响)

从上面的结果,可以看出,默认情况下,对于查询的数据,也是不区分大小写的
LIKE 'a%' 意味着 a 开头 与 A 开头的。
都会被检索出来。

1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%' COLLATE  Chinese_PRC_CS_AS
7> go
id          val
----------- ----------
          2 abc234
          4 aBC456
          5 aBc567

(3 行受影响)

从上面的结果,可以看出,当指定了 COLLATE  Chinese_PRC_CS_AS 之后
LIKE 'a%' 将只返回小写字母 a 开头的数据。 大写字母 A 开头的,将不被检索出来。

1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%' COLLATE  Chinese_PRC_CS_AS
7>  AND val LIKE '%B%'
8> go
id          val
----------- ----------
          2 abc234
          4 aBC456
          5 aBc567

(3 行受影响)

上面的查询,为检索 小写字母 a 开头的, 中间包含字母 B 或者 b 的 (因为这里的 val LIKE '%B%' 没有区分大小写 )

1>
2> SELECT
3>   *
4> FROM
5>   Tab
6> WHERE
7>  val LIKE 'a%'COLLATE  Chinese_PRC_CS_AS
8>  AND val LIKE '%B%' COLLATE  Chinese_PRC_CS_AS
9> go
id          val
----------- ----------
          4 aBC456
          5 aBc567

(2 行受影响)

上面的查询,为检索 小写字母 a 开头的, 中间包含字母 B 的 (因为这里的 val LIKE '%B%' 区分大小写 )

下面再设置  test 数据库,让其区分大小写
alter database test  COLLATE  Chinese_PRC_CS_AS

1> alter database test  COLLATE  Chinese_PRC_CS_AS
2> go

1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%'
7> go
消息 208,级别 16,状态 1,服务器 ZQWANG-RD\SQLEXPRESS,第 1 行
对象名 'Tab' 无效。

1> SELECT
2>   *
3> FROM
4>   tab
5> WHERE
6>  val LIKE 'a%'
7> go
id          val
----------- ----------
          1 ABC123
          2 abc234
          3 Abc345
          4 aBC456
          5 aBc567

(5 行受影响)

由上面的结果可以看到
alter database test  COLLATE  Chinese_PRC_CS_AS
这样的语句,只是设置 SQL 语句里面,对 表名/字段名 区分大小写
对查询数据的时候,LIKE 'a%' 的时候, 还是默认不区分大小写的。

下面恢复 test 数据库的设置,让其不区分大小写
alter database test COLLATE Chinese_PRC_CI_AS

1> alter database test COLLATE Chinese_PRC_CI_AS
2> go

每次写SQL, 如果需要区分大小写的话,都加 COLLATE  Chinese_PRC_CS_AS 也是一件麻烦的事情。
假如我希望让 Tab 的 val 字段,强制区分大小写的话。

ALTER TABLE tab
   ALTER COLUMN  val NVARCHAR(10) COLLATE Chinese_PRC_CS_AS
go

1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%'
7> go
id          val
----------- ----------
          2 abc234
          4 aBC456
          5 aBc567

(3 行受影响)

1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%'
7>  AND val LIKE '%B%'
8> go
id          val
----------- ----------
          4 aBC456
          5 aBc567

(2 行受影响)

由上面的结果可以看到
执行了
ALTER TABLE tab
  ALTER COLUMN  val NVARCHAR(10) COLLATE Chinese_PRC_CS_AS
之后。

所有对 tab 表的 val 字段的查询操作。
都自动强制区分大小写了。

恢复 tab 表的 val 字段,不区分大小写
ALTER TABLE tab
  ALTER COLUMN  val NVARCHAR(10) COLLATE Chinese_PRC_CI_AS

1> ALTER TABLE tab
2>   ALTER COLUMN  val NVARCHAR(10)(10) COLLATE Chinese_PRC_CI_AS
3> go

1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%'
7> go
id          val
----------- ----------
          1 ABC123
          2 abc234
          3 Abc345
          4 aBC456
          5 aBc567

(5 行受影响)

好,一切又恢复到默认情况下了。

----------
--分割线--
----------

处理好了 LIKE 的大小写
现在做做排序。

INSERT INTO [tab]
  SELECT '123ABC' UNION ALL
  SELECT '234abc' UNION ALL
  SELECT '345Abc' UNION ALL
  SELECT '456aBC' UNION ALL
  SELECT '567aBc'
go

1> SELECT
2>   *
3> FROM
4>   Tab
5> ORDER BY
6>   val
7> go
id          val
----------- ----------
          6 123ABC
          7 234abc
          8 345Abc
          9 456aBC
         10 567aBc
          1 ABC123
          2 abc234
          3 Abc345
          4 aBC456
          5 aBc567

(10 行受影响)

默认排序,也是不区分大小写的。

在查询 SQL SERVER 支持的排序规则。

SELECT
  *
FROM
  ::fn_helpcollations()
WHERE
  name LIKE 'Chinese_PRC%'

1> SELECT
2>   *
3> FROM
4>   Tab
5> ORDER BY
6>   val COLLATE Chinese_PRC_BIN
7> go
id          val
----------- ----------
          6 123ABC
          7 234abc
          8 345Abc
          9 456aBC
         10 567aBc
          1 ABC123
          3 Abc345
          4 aBC456
          5 aBc567
          2 abc234

(10 行受影响)

注:
ORDER BY val COLLATE Chinese_PRC_CS_AS 好像没有效果。
因此使用 Chinese_PRC_BIN 二进制排序

----------
--分割线--
----------

前面只有英文排序
现在处理中文排序

首先清空数据。

TRUNCATE TABLE Tab
go

INSERT INTO tab
  SELECT '一' UNION ALL
  SELECT '二' UNION ALL
  SELECT '三' UNION ALL
  SELECT '四' UNION ALL
  SELECT '五'
go

在查询 SQL SERVER 支持的排序规则。

SELECT
  *
FROM
  ::fn_helpcollations()
WHERE
  name LIKE 'Chinese_PRC%'

Chinese_PRC_CS_AS_KS_WS:
Chinese-PRC, case-sensitive, accent-sensitive, kanatype-sensitive, width-sensitive

-- 按照拼音来排序
1> SELECT
2>   *
3> FROM
4>   Tab
5> ORDER BY
6>   val COLLATE Chinese_PRC_CS_AS_KS_WS
7> go
id          val
----------- ----------
          2 二
          3 三
          4 四
          5 五
          1 一

(5 行受影响)

Chinese_PRC_Stroke_CI_AS_KS_WS:
Chinese-PRC-Stroke, case-insensitive, accent-sensitive, kanatype-sensitive, width-sensitive

-- 按照笔画数的多少来排序
1> SELECT
2>   *
3> FROM
4>   Tab
5> ORDER BY
6>   val COLLATE Chinese_PRC_Stroke_CS_AS_KS_WS
7> go
id          val
----------- ----------
          1 一
          2 二
          3 三
          5 五
          4 四

(5 行受影响)

SQL Server 中大小写区分的处理的更多相关文章

  1. 第一篇 SQL Server安全概述

    本篇文章是SQL Server安全系列的第一篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...

  2. 根据版本的不同整理所有的绿色SQL Server

    在这篇论坛文章中,读者可以了解到如何根据不同的SQL Server版本,整理出所有版本的绿色SQL Server的具体方法,详细内容请参考下文: 1. Sqlservr.exe 运行参数 Sql Se ...

  3. SQL Server与Oracle对比学习:权限管理(二) 一些有趣的比喻

    http://blog.csdn.net/weiwenhp/article/details/8094739 目录(?)[-] SQL Server权限管理 login 与user的区别 角色role ...

  4. 【译】第一篇 SQL Server安全概述

    本篇文章是SQL Server安全系列的第一篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...

  5. Oracle临时表和SQL Server临时表的不同点对比

    文章来源:http://www.codesky.net/article/201109/141401.html 1.简介 Oracle数据库除了可以保存永久表外,还可以建立临时表temporary ta ...

  6. SQL SERVER临时表的使用

    SQL SERVER临时表的使用 drop table #Tmp   --删除临时表#Tmpcreate table #Tmp --创建临时表#Tmp(    ID   int IDENTITY (1 ...

  7. 如何实现SQL Server临时表的创建?

    以下的文章主要是对SQL Server临时表的创建的实际操作步骤,以及在实际操作中我们要用到的实际应用代码的介绍,我在一个信誉度很好的网站找到一个关于其相关内容今天拿出来供大家分享. 创建临时表 方法 ...

  8. sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)

    sql server 关于表中只增标识问题   由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...

  9. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

随机推荐

  1. nginx fastcgi buffers影响页面输出数据大小记录

    一台测试服务器由于没做fastcgi_buffer单独设置,在跑一个显示10w条数据的循环输出时只能显示4700-5200条记录 <?php $str = ''; for($i = 0; $i ...

  2. Linux 07 故障恢复

    1. 模拟MBR扇区被破坏后的修复. MBR故障恢复: 1.备份 添加硬盘 启动操作系统: 添加硬盘: 对分区格式化: 挂载: 做备份: 破坏MBR 重启系统: 关闭虚拟机 设置光盘启动 救援模式: ...

  3. iOS通知NSNotificationCenter

    NSNotificationCenter消息通信 作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息 [[NSNotificat ...

  4. org.jawin.COMException: 8000ffff: Invalid ptr null flag(原址:http://osdir.com/ml/windows.devel.jawin/2006-01/msg00013.html)

    I now realise my arguments to invoke should be more along the lines of byte[] result = tApp.invoke(& ...

  5. poj2478--欧拉函数打表

    此题中对时间有要求,如直接使用欧拉函数求解,每输入一个n,就得进行循环求出<n的每个数的欧拉函数, 这样会超时, 于是我们可预先将欧拉函数打表, 再进行一个循环加法运算,便可不超时得解. #in ...

  6. RapidMiner的基本使用(一个医疗数据的简单决策树算法分析)

    RapidMiner的基本使用(一个医疗数据的简单决策树算法分析) RapidMiner的基本使用(一个医疗数据的简单决策树算法分析) 需要分析的文件: 右键分别创建读取excel数据,选择属性,设置 ...

  7. asp.net的Master-Content结构简介

    在一个网站中,页面应该具有统一的布局方式,这些统一的布局内同将显示到所有的页面中,它提供了用户最基本的功能.Asp.Net2.0通过Master-Content结构提供了这样统一页面管理的机制. Ma ...

  8. [推荐] 查看网站使用的JS框架

    查看各大网站使用的JS框架: 打开:http://oskarkrawczyk.github.com/wtframework/ 在这个中间的图片页面上右击,Add BookMarks.(添加到书签中) ...

  9. firemonkey打开子窗体

    procedure TForm1.Button1Click(Sender: TObject);varChildForm: TForm2;beginChildForm := TForm2.Create( ...

  10. 全排列的hash

    我们经常使用的数的进制为“常数进制”,即始终逢p进1.例如,p进制数K可表示为K = a0*p^0 + a1*p^1 + a2*p^2 + ... + an*p^n (其中0 <= ai < ...