SQL Server数据库查询区分大小写、全半角——排序规则的应用(转载)
SQL Server数据库查询区分大小写、全半角——排序规则的应用
因为偶然的原因,需要在INNER JOIN联表时,让对应字段进行区分大小写的比较。而默认情况下建立的Sql Server数据库是不区分大小写的,这个需求怎么实现呢?
要实现这个需求,至少有三个操作级别来实现:
1. 数据库级别:整个数据库中的char、varchar、text、nchar、nvarchar 和 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字句,指定排序规则可以影响查询结果。通过上面的图也可以看出,这个排序规则除可以区分大小写之外,还可以区分重音、假名、全半角。
结束语:
- 本文没有更深入研究排序规则的其他应用,比如对Order by的影响。
- 本文没有更深入研究在查询时对多个不同字段的影响机制。
- 示例代码另见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数据库查询区分大小写、全半角——排序规则的应用(转载)相关推荐
- 优化SQL Server数据库查询方法
本文详细介绍了优化SQL Server数据库查询方法. SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) ...
- 数据库-SQL Server数据库查询速度慢(连接超时)原因及优化方法
SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列 ...
- SQL Server数据库查询速度慢的原因和解决方法
SQL Server数据库查询速度慢的原因和解决方法 参考文章: (1)SQL Server数据库查询速度慢的原因和解决方法 (2)https://www.cnblogs.com/MyChange/p ...
- 动态创建Sql Server数据库相关(全)
CREATE DATABASE 创建一个新数据库及存储该数据库的文件,或从先前创建的数据库的文件中附加数据库. 说明 有关与 DISK INIT 向后兼容性的更多信息,请参见"Microso ...
- server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...
4.1.查询的类型 declare @value as int set @value = 50 select 'age:'as age,2008 years,@valueas va --这种查询时跟 ...
- sql server数据库查询超时报错
报错信息如下: 链接服务器"DBJointFrame"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "查询超时已过期". ...
- SQL SERVER数据库查询最近3个月数据
Select * from 你的表名 Where DATEADD(MONTH, -3, GETDATE()) < 你的表日期字段 例: Select * from tablen ...
- SQL SERVER数据库修改是否区分大小写
下面语句是设置SQL Server数据库是否区分大小写:(表名和数据库字段名) --修改数据库不区分大小写 alter database 数据库名称 COLLATE Chinese_PRC_CI_AS ...
- server sql top速度变慢解决方案_SQL Server数据库查询速度慢的原因和解决方法
SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列 ...
最新文章
- 工业富联2018年报来了!上市后首张成绩单大起底
- PC微信逆向:使用HOOK拦截二维码
- 关于 To B,我欠粉丝们一个热搜
- python 爬视频下载_Python爬虫进阶之爬取某视频并下载的实现
- boost::multiprecision模块tommath相关的测试程序
- 云原生DevOps的5步升级路径
- java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...
- typescript 接口 java_Typescript基础(4)——接口
- Title:eNSP 映射到外网
- 微软:四种方法暂时屏蔽IE最新漏洞
- python 两点曲线_全方位比较3种数据科学工具的比较:Python、R和SAS(附链接)
- 7月第3周社交网站综合排行Top10:新浪微博居首
- 【optimization、pypi-packages、Github、GitCode、pip】optimtool介绍文档
- 魔兽局域网协议UDP部分详细解释
- LiLei和HanMeiMei的隐式马尔可夫爱情
- 汇编语言 大小比较 理解 ja jna jg jle
- Windows Sockets错误码方案
- 物联网毕设 -- ESP32-CAN加摄像头传输图像,STM32驱动小车自动避障图像采集并显示到Android端
- 去除IDEA中代码的波浪线(黄色警示线)
- python中类的首字母一定得大写吗_Python学习
热门文章
- openssl漏洞怎么处理_以太坊UDP流量放大反射DDOS漏洞
- 51nod 1414 冰雕 思路:暴力模拟题
- mysql delete limit用法_你习惯delete语句后带上limit吗
- 二叉树的层序遍历—leetcode102
- html设置边框dw,Dreamweaver Css边框属性
- 最酷的windows后门 呵呵
- 牛客contest897 D-Bamboo Rat(二分+黑白染色+最小割)
- python 判断等于0_Python 条件语句介绍
- layui登录页面写入数据_layui 页面保存数据
- [BUUCTF-pwn]——pwnable_orw (ORW)