SQL Server数据库查询区分大小写、全半角——排序规则的应用

因为偶然的原因,需要在INNER JOIN联表时,让对应字段进行区分大小写的比较。而默认情况下建立的Sql Server数据库是不区分大小写的,这个需求怎么实现呢?

要实现这个需求,至少有三个操作级别来实现:

1. 数据库级别:整个数据库中的charvarchartextncharnvarchar 和 ntext 数据都区分大小写。(为描述方便,下文不再明确强调这些数据类型。)但这样做有个明显的坏处,那就是整个数据库的这些字段的比较,都要进行严格匹配。比如下面的两条Sql语句会得到完全不同的两种结果:

SELECT * FROM [TABLE] WHERE [COLUMN] LIKE ‘%KeyWord%’
SELECT * FROM [TABLE] WHERE [COLUMN] LIKE ‘%keyword%’

因为数据库在比较时会严格按照大小写来区别,这样就会导致我们在程序开发过程中难以满足十分复杂的查询需求,特别突出的例子便是关键字搜索——我们无法预知客户输入内容的大小写,我们更不能要求客户输入的关键字区分大小写。

2. 表字段级别:只对特定的表字段进行大小写区分。这样做在整体上减小了大小写限定的范围,从全数据库减小到当前指定的字段。但使用起来仍然有些局限性。

3. 查询级别:只对本次查询限定大小写区分。这也是本文重点介绍的实现方式。这样操作可以让我们不对以前的数据库做任何的修改,只对当前这次查询区分大小写,也不会影响程序中别处对这些字段的查询。

好了,上文说了三个实现级别,那具体怎么实现呢?这就要用到SQL数据库中的“排序规则”了。我们可以在数据库的属性上,设置排序规则,也可以在表设计的字段属性里设置排序规则。具体要设置什么样的排序规则,后面来说,我们先说查询级别的排序规则。下面有一段SQL片段可以演示在查询级别区分大小写的排序规则应用:

use tempdb
set nocount on
--1--
print '建立初始数据表Customer'
create table Customer(id int,uname varchar(10))
insert into Customer
select 1,'Jim' union all
select 2,'Simith'  union all
select 3,'uonun'select * from Customer--2--
print '建立初始数据表Info'
create table Info(uname varchar(10),phone varchar(11))
insert into Info
select 'JIM','13800000000' union all
select 'Simith','13911111111' union all
select 'uonun','13812345678'select * from Info--3--
print '不区分大小写,不区分全半角'
select c.id,c.uname as 'c.uname',i.uname as 'i.uname',i.phone
from Customer as c inner join Info as i
on c.uname = i.uname--4--
print '区分大小写,不区分全半角'
select c.id,c.uname as 'c.uname',i.uname as 'i.uname',i.phone
from Customer as c inner join Info as i
on c.uname = i.uname
collate Chinese_PRC_CS_AS--5--
print '不区分大小写,区分全半角'
select c.id,c.uname as 'c.uname',i.uname as 'i.uname',i.phone
from Customer as c inner join Info as i
on c.uname = i.uname
collate Chinese_PRC_CI_AI_WS--6--
print '区分大小写,区分全半角'
select c.id,c.uname as 'c.uname',i.uname as 'i.uname',i.phone
from Customer as c inner join Info as i
on c.uname = i.uname
collate Chinese_PRC_CS_AI_WSDROP TABLE Customer
DROP TABLE Info/*
建立初始数据表Customer
id          uname
----------- ----------
1           Jim
2           Simith
3           uonun建立初始数据表Info
uname      phone
---------- -----------
JIM        13800000000
Simith     13911111111
uonun      13812345678不区分大小写,不区分全半角
id          c.uname    i.uname    phone
----------- ---------- ---------- -----------
1           Jim        JIM        13800000000
2           Simith     Simith     13911111111
3           uonun      uonun      13812345678区分大小写,不区分全半角
id          c.uname    i.uname    phone
----------- ---------- ---------- -----------
2           Simith     Simith     13911111111
3           uonun      uonun      13812345678不区分大小写,区分全半角
id          c.uname    i.uname    phone
----------- ---------- ---------- -----------
1           Jim        JIM        13800000000
3           uonun      uonun      13812345678区分大小写,区分全半角
id          c.uname    i.uname    phone
----------- ---------- ---------- -----------
3           uonun      uonun      13812345678
*/

通过上面的SQL语句可以看出,我们在查询时使用COLLATE字句,指定排序规则可以影响查询结果。通过上面的图也可以看出,这个排序规则除可以区分大小写之外,还可以区分重音、假名、全半角。

结束语:

  1. 本文没有更深入研究排序规则的其他应用,比如对Order by的影响。
  2. 本文没有更深入研究在查询时对多个不同字段的影响机制。
  3. 示例代码另见CorePlex代码库: http://udnz.com/Code-409.htm

原文地址:http://blog.udnz.com/Article/use-COLLATE-in-Transact-SQL.aspx

转载于:https://www.cnblogs.com/RoseDavid/archive/2012/10/19/2730635.html

SQL Server数据库查询区分大小写、全半角——排序规则的应用(转载)相关推荐

  1. 优化SQL Server数据库查询方法

    本文详细介绍了优化SQL Server数据库查询方法. SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) ...

  2. 数据库-SQL Server数据库查询速度慢(连接超时)原因及优化方法

    SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列 ...

  3. SQL Server数据库查询速度慢的原因和解决方法

    SQL Server数据库查询速度慢的原因和解决方法 参考文章: (1)SQL Server数据库查询速度慢的原因和解决方法 (2)https://www.cnblogs.com/MyChange/p ...

  4. 动态创建Sql Server数据库相关(全)

    CREATE DATABASE 创建一个新数据库及存储该数据库的文件,或从先前创建的数据库的文件中附加数据库. 说明 有关与 DISK INIT 向后兼容性的更多信息,请参见"Microso ...

  5. server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...

    4.1.查询的类型 declare @value as int set @value = 50 select  'age:'as age,2008 years,@valueas va --这种查询时跟 ...

  6. sql server数据库查询超时报错

    报错信息如下: 链接服务器"DBJointFrame"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "查询超时已过期". ...

  7. SQL SERVER数据库查询最近3个月数据

    Select    * from    你的表名 Where    DATEADD(MONTH, -3, GETDATE()) < 你的表日期字段 例: Select * from tablen ...

  8. SQL SERVER数据库修改是否区分大小写

    下面语句是设置SQL Server数据库是否区分大小写:(表名和数据库字段名) --修改数据库不区分大小写 alter database 数据库名称 COLLATE Chinese_PRC_CI_AS ...

  9. server sql top速度变慢解决方案_SQL Server数据库查询速度慢的原因和解决方法

    SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列 ...

最新文章

  1. 工业富联2018年报来了!上市后首张成绩单大起底
  2. PC微信逆向:使用HOOK拦截二维码
  3. 关于 To B,我欠粉丝们一个热搜
  4. python 爬视频下载_Python爬虫进阶之爬取某视频并下载的实现
  5. boost::multiprecision模块tommath相关的测试程序
  6. 云原生DevOps的5步升级路径
  7. java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...
  8. typescript 接口 java_Typescript基础(4)——接口
  9. Title:eNSP 映射到外网
  10. 微软:四种方法暂时屏蔽IE最新漏洞
  11. python 两点曲线_全方位比较3种数据科学工具的比较:Python、R和SAS(附链接)
  12. 7月第3周社交网站综合排行Top10:新浪微博居首
  13. 【optimization、pypi-packages、Github、GitCode、pip】optimtool介绍文档
  14. 魔兽局域网协议UDP部分详细解释
  15. LiLei和HanMeiMei的隐式马尔可夫爱情
  16. 汇编语言 大小比较 理解 ja jna jg jle
  17. Windows Sockets错误码方案
  18. 物联网毕设 -- ESP32-CAN加摄像头传输图像,STM32驱动小车自动避障图像采集并显示到Android端
  19. 去除IDEA中代码的波浪线(黄色警示线)
  20. python中类的首字母一定得大写吗_Python学习

热门文章

  1. openssl漏洞怎么处理_以太坊UDP流量放大反射DDOS漏洞
  2. 51nod 1414 冰雕 思路:暴力模拟题
  3. mysql delete limit用法_你习惯delete语句后带上limit吗
  4. 二叉树的层序遍历—leetcode102
  5. html设置边框dw,Dreamweaver Css边框属性
  6. 最酷的windows后门 呵呵
  7. 牛客contest897 D-Bamboo Rat(二分+黑白染色+最小割)
  8. python 判断等于0_Python 条件语句介绍
  9. layui登录页面写入数据_layui 页面保存数据
  10. [BUUCTF-pwn]——pwnable_orw   (ORW)