转自:http://www.cnblogs.com/symbol441/archive/2007/11/23/969981.html
在网络上搜索相关的很多资料,总结了一下,发生这种情况的原因主要是由于排序规则引起的:
不指定排序规则的话
临时表是否区分大小写,与tempdb数据库的排序有关.
数据库对象是否区分大小写,与数据库本身的排序规则有关.
变量是否区分大小写,与数据库本身的排序规则有关,估计也是与tempdb数据库有关吧.
二进制编码:根据针对每个字符定义的位模式来排序与比较Microsoft®SQL Server™资料表中的资料。 Binary排序方式区分大小写,亦即小写比大写优先,且区分腔调字。这是最快的排序方式。
若未选取此选项,SQL Server将遵循关联之语言或字母的字典内定义的排序与比较规则。
区分大小写指定SQL Server区分大写与小写字母。若未选取此选项,SQL Server会将大写与小写字母视为相等。若您没有选取[区分大小写],SQL Server并不会定义小写字母与大写字母的排序方式何者较高.
解决方案:
方法一.安装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
小结一下:
--表
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
-- 不区分大小写
指定排序规则即可
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 ))
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com