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

MSSQL
SQLServer中求两个字符串的交集
SQL Server 触发器 表的特定字段更新时,触发Update触发器
SQL 查询分析中使用net命令问题
SQLServer 批量导入目录文件
sql语言中delete删除命令语句详解
Linq to SQL 插入数据时的一个问题
一个简单的SQL 行列转换语句
SQLServer 常用语句(按功能分)
SQLServer 管理常用SQL语句
SQL Server 2000中的触发器使用
SQL小技巧 又快又简单的得到你的数据库每个表的记录数
Sql Server 2000删除数据库备份文件
批量更新数据库所有表中字段的内容,中木马后的急救处理
sqlserver 通用分页存储过程
远程连接局域网内的sql server 无法连接 错误与解决方法
目前用到的两个分页存储过程代码
sqlserver 多表关联时在where语句中慎用trim()方法
Sql2005注射辅助脚本[粗糙版]
sql 2005不允许进行远程连接可能会导致此失败的解决方法
MSSQL2005数据库备份导入MSSQL2000

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


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