当前位置:C++技术网 > 资讯 > MSSQL Server查询不区分大小写问题解决办法

MSSQL Server查询不区分大小写问题解决办法

更新时间:2017-02-09 12:05:15浏览次数:1+次

    今天在开会员的时候,将perth名称开成了Perth,结果发现开通成功。通过后台查询,发现这两个用户名竟然是同步修改的。这说明MSSQL没有区分大小写。也就是说,PERTH和perth以及Perth都是当做同一个用户。
    这个做法有点怪异,所以要修改一下配置,支持大小写区分。网上查询的资料很多,不过有点乱。所以我在这里总结下。
    决定数据库是否区分大小写的是排序规则,规则大致如下:
_BIN
 二进制排序
_CI_AI
 不区分大小写、不区分重音、不区分假名类型、不区分全半角
 _CI_AI_WS
 不区分大小写、不区分重音、不区分假名类型、区分全半角
_CI_AI_KS
 不区分大小写、不区分重音、区分假名类型、不区分全半角
_CI_AI_KS_WS
 不区分大小写、不区分重音、区分假名类型、区分全半角
_CI_AS
 不区分大小写、区分重音、不区分假名类型、不区分全半角
_CI_AS_WS
 不区分大小写、区分重音、不区分假名类型、区分全半角
_CI_AS_KS
 不区分大小写、区分重音、区分假名类型、不区分全半角
_CI_AS_KS_WS
 不区分大小写、区分重音、区分假名类型、区分全半角
_CS_AI
 区分大小写、不区分重音、不区分假名类型、不区分全半角
_CS_AI_WS
 区分大小写、不区分重音、不区分假名类型、区分全半角
_CS_AI_KS
 区分大小写、不区分重音、区分假名类型、不区分全半角
_CS_AI_KS_WS
 区分大小写、不区分重音、区分假名类型、区分全半角
_CS_AS
 区分大小写、区分重音、不区分假名类型、不区分全半角
 
_CS_AS_WS
 区分大小写、区分重音、不区分假名类型、区分全半角
_CS_AS_KS
 区分大小写、区分重音、区分假名类型、不区分全半角
_CS_AS_KS_WS
 区分大小写、区分重音、区分假名类型、区分全半角

*_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的
*_cs: case sensitive collation,区分大小写
*_ci: case insensitive collation,不区分大小写
    这是是否区分大小写的选项。完整的排序一般是这样的:
Chinese_PRC_CS_AS
    第一个是字符集编码,后面两个是区分大小写的选项。我们一般选择的是中文编码,英文区分大小写,所以就是Chinese和CS了,其他的无关紧要。

    修改配置的方法分为下面几个:
1.修改数据表字段的排序规则
ALTER TABLE 你的表名
ALTER COLUMN  字段名称 varchar(50)  COLLATE Chinese_PRC_CS_AS;

或者在可视化的界面中的修改表设计的界面,选择这个字段,在排序规则里选择一个合适的即可。
修改数据表字段的排序规则
2.全局数据库修改排序规则
alter database 你的数据库名 COLLATE Chinese_PRC_CS_AI;

    或者在可视化的界面,选择数据库,右击,选择属性,点击“选项”页,修改排序规则。不过全局修改有点麻烦。不建议。因为已经有用户连接了数据库,所以此时的修改会失败。你可以在这个页的“限制访问”选择单用户(Single User),然后再修改排序规则。修改完排序规则后,再将“限制访问”修改为多用户(Multi User)。
    需要注意的是,全局修改不会立即将所有已经存的表的字段的排序规则更新的。而数据表最终生效的是表字段指定的规则,请参照第1种修改。

3.直接在SQL语句后面指定单次查询是否区分大小写,临时性的
select * from a where name='cjjjs' collate Chinese_PRC_CS_AI--区分大小写