比如说一个表中两条记录的address字段值分别为:aaaa 和 aAAa,如果用 

select * from mytable where address = 'aaaa'

则两条记录都查出来了,我希望只得到一条记录,这样的SQL应该怎么写?

 

create table #a(

       [id] [char] (10),

       [address] [char] (10)

)

insert into #a(id , address) values('1' , 'aaaa')

insert into #a(id , address) values('1' , 'aAAa')

 

select * from #a where address = 'aaaa' COLLATE Chinese_PRC_CS_AS

select * from #a where address = 'aAAa' COLLATE Chinese_PRC_CS_AS

 

drop table #a

 

id         address    

---------- ---------- 

1          aaaa      

 

(所影响的行数为 1 行)

 

id         address    

---------- ---------- 

1          aAAa      

 

(所影响的行数为 1 行)

 

 

 

如何查只以大写AB开头的呢?

通常情况下写select * from 表名 where 列名 like 'AB%'

但是这样,以小写ab开头的纪录也会被查找出来 如何查只以大写AB开头的呢?

select * from table where left(col,2) = 'AB%' COLLATE Chinese_PRC_CS_AS

select * from table where col like 'AB%' COLLATE Chinese_PRC_CS_AS

 

 

 

 

 

ALTER TABLE tb

 ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS 

--不区分大小写

ALTER TABLE tb 

 ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CS_AS 

--区分大小写

数据库

ALTER DATABASE database 

COLLATE Chinese_PRC_CS_AS 

--区分大小写

 

ALTER DATABASE database 

 COLLATE Chinese_PRC_CI_AS 

--不区分大小写

 

 

方法一.安装SQL时选择区分大小写

或安装完以后重建mastar,选择区分大小

C:\Program Files\Microsoft SQL Server\80\Tools\Binn\rebuildm.exe

 

方法二.sql server 8.0以上的版本才可以,7.0及其以下不支持

alter database 数据库 COLLATE Chinese_PRC_CS_AS

修改排序规则,改成大小写敏感的排序规则

如果只修改一个表,用alter table语句 

如果修改一个库的默认排序规则,用alter datebase语句 

如果修改整个服务器的默认排序规则,用Rebuildm.exe重建master库 

--指定排序规则就可以了

 

--示例 

select replace('AbacB' collate Chinese_PRC_CS_AS_WS,'B','test') 

 

--如果你是要求表支持,则可以建表时指定排序规则,这样replace就不用写排序规则了 

 

--示例 

create table tb(a varchar(20) collate Chinese_PRC_CS_AS_WS) 

insert tb values('Abac') 

 

select replace(a,'a','test') from tb

 

drop table tb

 

指定排序规则即可

 

Windows 排序规则名称 

在 COLLATE 子句中指定 Windows 排序规则名称。Windows 排序规则名称由排序规则指示器和比较风格构成。 

 

语法 

< Windows_collation_name > :: = 

 

    CollationDesignator_<ComparisonStyle>

 

    < ComparisonStyle > ::= 

        CaseSensitivity_AccentSensitivity 

        [_KanatypeSensitive [_WidthSensitive ] ] 

        | _BIN 

 

参数 

CollationDesignator 

 

指定 Windows 排序规则使用的基本排序规则。基本排序规则包括: 

 

当指定按字典排序时应用其排序规则的字母表或语言

 

 

用于存储非 Unicode 字符数据的代码页。 

例如 Latin1_General 或法文,两者都使用代码页 1252,或土耳其文,它使用代码页 1254。 

 

CaseSensitivity

 

CI 指定不区分大小写,CS 指定区分大小写。

 

AccentSensitivity

 

AI 指定不区分重音,AS 指定区分重音。

 

KanatypeSensitive

 

Omitted 指定不区分大小写,KS 指定区分假名类型。

 

WidthSensitivity

 

Omitted 指定不区分大小写,WS 指定区分大小写。

 

BIN

 

指定使用二进制排序次序。 

 

 

 

如果你只是目前查询区分,那么还是不要这样改,免得又反悔,如此查询:

select * from a 

/*

a_nam      a_add      

---------- ---------- 

1          aa

1          bb

2          cc

2          vv

2          kk

3          dd

3          ee

4          dd

5          ee

6          yy

6          yy

 

(11 row(s) affected)

*/

现在我们查询a_add = 'aa'的,'Aa'等等不行!

Example 1:

 

select * from a 

where a_add collate Chinese_PRC_CS_AS_WS = 'aa' 

/*

a_nam      a_add      

---------- ---------- 

1          aa

 

(1 row(s) affected)

*/

 

Example 2:

 

select * from a 

where a_add collate Chinese_PRC_CS_AS_WS = 'Aa' 

/*

a_nam      a_add      

---------- ---------- 

 

(0 row(s) affected)

*/

 

方法三.上面的记不住,那么就用最笨的方法,转化为ascii

select * from a

where 

ascii(substring(a_add,1,1)) = ascii(substring('Aa',1,1))

and 

ascii(substring(a_add,2,1)) = ascii(substring('Aa',2,1))

/*

a_nam      a_add      

---------- ---------- 

 

(0 row(s) affected)

*/

 

方法三:任何版本都可以

select * from a 

where cast(a_add as varbinary(10))= cast('aa' as varbinary(10))