当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 课程讲解 如何使用SQL Server校勘功能

MSSQL
精细讲述SQL Server数据库备份多种方法
让SQL Server也能使用2G以上内存
SQL Server数据库崩溃恢复之法
创建区分大小写的SQL Server 2000实例
SQL Server中易混淆的数据类型
如何优化SQL Server数据库查询
使用Robot连接SQL的例子
如何让你的SQL运行得更快
对Sql Server中的表添加级联更新和级联删除
常用SQL语句书写技巧
SQL Server与Oracle实施成本上的差异
解析SQL Server的数据类型 BLOB
SQL Server数据库和XML标识语言的集成
SQLServer 数据库还原和孤立用户的解决办法
SQL Server 2000/2005 分页SQL
Sql Server锁表
SQLServer2005实现远程数据库备份
SQL精妙语句
SQL Server 2008的逻辑查询处理步骤
如何让你的SQL运行得更快

MSSQL 中的 课程讲解 如何使用SQL Server校勘功能


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 39 ::
收藏到网摘: n/a

校勘(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所示的语句来添加这条记录。

 

 

图片A

 

 

图片B

 

 

图片C

使用默认的字符集,此查询将会返回一系列问号,如果您想得到正确的结果,那么必须需要使用数据库可以接受的Unicode字符集,参见图片C。

如果您想确认一个给定数据库中使用的初始校勘,可以使以下的代码:

SELECT collation_name

FROM master.sys.databases

WHERE Name = 'SQLTips'