首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

针对解决sql server数据库中不区分大小写有关问题

2012-11-03 
针对解决sql server数据库中不区分大小写问题转自:http://www.cnblogs.com/symbol441/archive/2007/11/23/

针对解决sql server数据库中不区分大小写问题

转自: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))???

???

热点排行