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

MSSQL
SQL Server 中死锁产生的原因及解决办法
教你在SQL Server 2000数据库中使用分区
数据仓库基本报表制作过程中的SQL写法
自动定时重启sql server回收内存
轻松解决SQL Server 2005中的常见问题
用一个案例讲解SQL Server数据库恢复
安装SQL Server 2005时出现计数器错误
讲解SQL Server 2005数据库的同义词Bug
利用SQL语句对不同数据库进行高效果分页
三种数据库利用SQL语句进行高效果分页
数据库连接字符串的常见问题和解决方法
教你快速掌握一些方便易用的SQL语句
深入分析SQL Server的数据转换服务
系统默认的MySQL用户名消失的解决方法
SQL 2008邮件故障排除:发送测试电子邮件
SQL Server 2005日志文件损坏的处理方法
在SQL Server 2005数据库中进行错误捕捉
SQL Server查询速度慢原因及优化方法
加密SQL Anywhere 提升政府行业数据安全
Windows Server 2008之数据安全保护

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 84 ::
收藏到网摘: 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'