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

MSSQL
SQL2005学习笔记 APPLY 运算符
SQL2005学习笔记 EXCEPT和INTERSECT运算符
SQL2005 学习笔记 窗口函数(OVER)
SQL2005 ROW_NUMER实现分页的两种常用方式
SQL Server中的XML数据进行insert、update、delete
在安装sql2005中或安装后sa用户无法登陆系统解决方法
SQL2005 自动备份的脚本
在SQLServer 2005中编写存储过程
SQL2005 服务器因重装改名后出错的说明
使用c#构造date数据类型
SQLServer2005 批量查询自定义对象脚本
SQLServer2005 Output子句获取刚插入的ID值
SQLServer 设置单词首字母大写
SQLServer ntile获取每组前10%的数据
安装SQL2005提示 找不到任何SQL2005组件的问题解决方案
sql2005开发版 没有任何功能可以安装
超详细的sql2005图解安装全过程
sqlserver2005 安装图解教程
winXP系统安装SQLServer2005开发版具体过程与注意问题
SQLServer 2005系统配置要求官方说明

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


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