课程讲解 如何使用SQL Server校勘功能
来源:builder.com 发布时间:2009-01-13 13:27:00
校勘(collation)是指对代码页、字母大小写、音调、语言和字母表的整理,很多校勘都是在数据进入数据库之前进行的,根据我的经验,北美的大部分数据库管理员都在使用默认的大小写敏感的校勘设定,这对于数据本身没有影响,但是对于数据的比较和索引会造成影响。
这篇文章将向您介绍一些相关的校勘方法,以及数据库对多种字符集的处理方法。
为了说明校勘的使用,我们首先来创建一个数据库,列表A给出了创建数据库的代码。
CREATE SCHEMA CaseCheck
GO
CREATE TABLE CaseCheck.Names
(
NamePK Int Identity(1,1) PRIMARY KEY,
Name Varchar(50) NOT NULL
)
GO
INSERT INTO CaseCheck.Names VALUES ('Fuller')
INSERT INTO CaseCheck.Names VALUES ('FuLLer')
INSERT INTO CaseCheck.Names VALUES ('FULLER')
INSERT INTO CaseCheck.Names VALUES ('fuller')
GO
列表A
列表B是一些查询,对于大小写不敏感的情况,这几个查询将返回相同的四个数据行,但是如果我们的任务是从数据行中选取大小写完全匹配的记录呢?
SELECT * FROM CaseCheck.Names
SELECT * FROM CaseCheck.Names WHERE Name = 'fuller'
SELECT * FROM CaseCheck.Names WHERE Name = 'FULLER'
SELECT * FROM CaseCheck.Names WHERE Name = 'fuller'
GO
列表 B
现在我们就要使用校勘的功能了,尽管在数据库创建的时候,数据库管理员已经指定了校勘的选项,但是您可以通过WHERE语句中的COLLATE选项来使用不同的校勘设定,在列表C的查询中,前三个都返回了一条记录,而最后一个查询的返回结果为空。
SELECT * FROM CaseCheck.Names WHERE Name = 'fuller'
COLLATE Latin1_General_CS_AS
SELECT * FROM CaseCheck.Names WHERE Name = 'FULLER'
COLLATE Latin1_General_CS_AS
SELECT * FROM CaseCheck.Names WHERE Name = 'fuller'
COLLATE Latin1_General_CS_AS
SELECT * FROM CaseCheck.Names WHERE Name = 'FUllER'
COLLATE Latin1_General_CS_AS
GO
列表 C
假设您现在想把所有'fuller'形式的拼写改为'Fuller'(包括像'fUlLEr'这种毫无意义的拼写组合),通过列表D中的代码,您可以非常轻松地实现这一功能。
UPDATE CaseCheck.NamesSET Name = UPPER(LEFT(Name,1))
+ LOWER(SUBSTRING(Name,2,LEN(Name)-1))
列表D
从大型主机上导入数据的时候,我都会首先运行以上的代码,这样就不必再担心单词大小写的问题了。
如果您想查看所有的校勘选项及其简要说明,可以运行以下的SQL代码:SELECT * FROM ::fn_helpcollations()。
想要查看数据库当前的校勘设定,可以使用以下代码:
SELECT collation_name
FROM master.sys.databases
WHERE Name='SQLTips'
在列表E中,我添加了一些带有特殊字符的数据行,我使用了我的好朋友DejanSunderic的名字,他的名字应该拼写为Šunderic'(字母c实际上应该有重音符号的,由于使用的字体,所以显示成了现在的效果)。
INSERT INTO CaseCheck.Names VALUES
(NChar(352)+ 'underi' + NChar(263))
INSERT INTO CaseCheck.Names VALUES
('SUNDERIC')
INSERT INTO CaseCheck.Names VALUES
('sUnDeRI' + Nchar(263))
INSERT INTO CaseCheck.Names VALUES
('Sunderi' + Nchar(263))
GO
列表 E
如果不使用COLLATE,那么会发生非常有意思的事情,运行一下的查询语句:
SELECT *
FROM CaseCheck.Names
WHERE Name LIKE N'S%'
您得到的结果是:
NamePK Name
6 SUNDERIC
7 sUnDeRIc
8 Sunderic
注意,带有特殊字符的'Šunderic'并没有被包含在内,
让我们再来看看另外一个实验:
SELECT * FROM CaseCheck.Names
ORDER BY Name
运行此查询的结果如下:
NamePK Name
5 Šunderic
1 Fuller
2 FuLLer
3 FULLER
4 fuller
6 SUNDERIC
7 sUnDeRIc
这里有很明显的错误,PK5应当位于'Fuller'之后,我不是语言专家,因此不知道它应该位于Ss的什么位置,但是我觉得这是本地规则造成的结果,很明显,'Šunderic'应该出现在所有的'Fuller'之后,而不是在'Fuller'前面。
我还进行了另外一项实验,使用西里尔字母来拼写我的好朋友Alexander Karmanov的名字,在图片A中您可以看到西里尔字母的拼写,我运行了图片B所示的语句来添加这条记录。
![](https://img.aspxhome.com/file/UploadPic/20091/200911419550985.jpg)
图片A
![](https://img.aspxhome.com/file/UploadPic/20091/200911419551514.jpg)
图片B
![](https://img.aspxhome.com/file/UploadPic/20091/200911419551643.jpg)
图片C
使用默认的字符集,此查询将会返回一系列问号,如果您想得到正确的结果,那么必须需要使用数据库可以接受的Unicode字符集,参见图片C。
如果您想确认一个给定数据库中使用的初始校勘,可以使以下的代码:
SELECT collation_name
FROM master.sys.databases
WHERE Name = 'SQLTips'
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 前言Javascript 团体的每个人都喜欢新的API,语法更新以及特性,它们提供了更好的,更智能,更有效的方式以完成重要的任务。继上一篇的
- ??,本文中,使用到的工具有:Pycharm,Anaconda,MySQL 5.5,spyder(Anaconda)什么是 PyMySQL?
- 我就废话不多说了,直接上代码吧!#coding:utf-8import osimport statimport shutil#filePat
- 前言pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能希望满足某些条件才执行某些测试用例,否则
- 1.0 新建项目1.1 初始化项目输入npm init,之后需要填什么就写什么新建src目录,并在src目录下新建alert.vue$ np
- 本文实例讲述了PHP实现的线索二叉树及二叉树遍历方法。分享给大家供大家参考,具体如下:<?php require '
- 我就废话不多说了,大家还是直接看代码吧!talk is cheap from openpyxl import Workbook
- 前端开发中两个很不错的小技巧, CSS三角形与圆角背景. 的确, 它们都可以通过图片来实现, 但, 抛开用代码实现可以减小图片加载量不说,
- 本文实例讲述了php基于协程实现异步的方法。分享给大家供大家参考,具体如下:github上php的协程大部分是根据这篇文章实现的:http:
- 一、数据插入思路如果一条一条插入普通表的话,效率太低下,但内存表插入速度是很快的,可以先建立一张内存表,插入数据后,在导入到普通表中。1、创
- 初级画心学Python,感觉你们的都好复杂,那我来个简单的,我是直接把心形看作是一个正方形+两个半圆:于是这就很简单了,十行代码解决:imp
- Plotly Express是对 Plotly.py 的高级封装,内置了大量实用、现代的绘图模板,用户只需调用简单的API函数,即可快速生成
- 一般来说,pytorch 的Parameter是一个tensor,但是跟通常意义上的tensor有些不一样1) 通常意义上的tensor 仅
- 在Google上搜一下,可以发现一大堆对ASP不好的评价,什么运行速度慢、异常处理机制不好、缺乏面向对象机制、开发效率低、漏洞多等等。为了让
- 宝塔更新Python版本因为在宝塔中的Python版本为2.6.8,使用宝塔Python项目管理的话需要把Python升级到3.x,不然的话
- 1、原材料1.1 花灯纸如下所示,还可以加上自己喜欢的图案、文字等。2.2 Python环境和模块一台安装了Python环境的电脑,Pyth
- 之前在网上看过好多关于mysql.sock不见的问题,并没有关注这个东西存在的意义,直到自己的mysql也出现了相同的问题。让人纠结了一把…
- Go语言最主要的特性自动垃圾回收更丰富的内置类型函数多返回值错误处理匿名函数和闭包类型和接口并发编程反射语言交互性高性能/高效开发安装安装说
- 如何让页面超时并指定一个超时时间?下面就是利用缓冲的程序页面事例: <%@ OutputCache Du
- 本文研究的主要是python通过elixir包操作mysql数据库的相关实例,具体如下。python操作数据库有很多方法,下面介绍elixi