当前位置:首页>>开发编程>>数据库>>新闻内容  
如何使用SQL Server实现校勘功能
作者: 发布时间:2007-10-8 20:37:06 | 【字体:

校勘(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 SUNDERI

  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"


文章来源:
·SQL Server中各种语句的完整语法
·如何压缩SQL Server 2005指定数据库文件和日志的大小?
·SQL Server 2005压缩数据库和日志文件的方法
·教你安全配置SQL Server 2000数据库
·如何在Windows XP上安装SQL Server 2000
·SQL Server数据库从2000还原为2005的步骤
·SQL Server数据库还原的SQL语句及操作
·SQL Server 2000导入SQL Server 2005生成脚本的问题
·在SQL Server 2005下还原数据库的一个错误解决
·在SQL Server 2005新建用户出15195错误
 放生
 愚爱
 够爱
 触电
 白狐
 葬爱
 光荣
 画心
 火花
 稻香
 小酒窝
 下雨天
 右手边
 安静了
 魔杰座
 你不像她
 边做边爱
 擦肩而过
 我的答铃
 怀念过去
 等一分钟
 放手去爱
 冰河时代
 你的承诺
 自由飞翔
 原谅我一次
 吻的太逼真
 左眼皮跳跳
 做你的爱人
 一定要爱你
 飞向别人的床
 爱上别人的人
 感动天感动地
 心在跳情在烧
 玫瑰花的葬礼
 有没有人告诉你
 即使知道要见面
 爱上你是一个错
 最后一次的温柔
 爱上你是我的错
 怎么会狠心伤害我
 不是因为寂寞才想
 亲爱的那不是爱情
 难道爱一个人有错
 寂寞的时候说爱我