SQL Server大小写敏感问题

0    32    1

Tags:

👉 本文共约930个字,系统预计阅读时间或需4分钟。

现象

如下的SQL语句有的时候报错,有的时候正常:

原因:数据库大小写敏感性问题,

介绍

SQL SERVER大小写敏感问题,其实是两个问题:

  • 标识符,例如表名和字段名,是否区分大小写;
  • 字符型字段进行比较时,是否区分大小写。

第一个问题

与SQL SERVER数据库的COLLATE属性有关。这个属性的关于大小写敏感子属性的取值有两种:
CI case-insensitive
CS case-sensitive

当创建表等对象时,数据字典中保存的表明和字段名的大小写等同于SQL语句中的大小写。
如果用大写T创建表,字典中保存的表名就是大写T;
如果用小写t创建表,字典中保存的表名就是小写t。

如果数据库的COLLATE是CI,则
select from t
select
from T
查询到的是同一个表,原因在于在将SQL语句中的表名与数据字典中的表名进行比较时,采用了CI比较,也就是忽略了大小写。
btw 此时数据库中不可能同时存在表t和表T。

如果数据库的COLLATE是CS,则
select from t
select
from T
查询到的是不同的表,原因在于在将SQL语句中的表名与数据字典中的表名进行比较时,采用了CS比较,也就是不忽略了大小写。

此时数据库中可以同时存在表t和表T。
如果此时修改库的COLLATE属性从CS到CI,执行会失败:
ALTER DATABASE [test] COLLATE Chinese_PRC_CI_AS
消息 1505,级别 16,状态 1,第 1 行
CREATE UNIQUE INDEX 语句终止,因为发现对象名称 'sys.sysschobjs' 和索引名称 'nc1' 有重复的键。重复的键值为 (0, 1, T)。
消息 5072,级别 16,状态 1,第 1 行
ALTER DATABASE 失败。无法将数据库 'test' 的默认排序规则设置为 Chinese_PRC_CI_AS。

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

第二个问题

与数据库和字段的COLLATE属性有关。后者的单独设置可以覆盖数据库的全局设置。

库、字段都可以设置 collate 属性,但是表不能设置 collate 属性

总结

1、查询SQL Server数据库的大小写敏感设置

2、配置大小写敏感(系统数据库不能修改)

参考

http://blog.itpub.net/9844649/viewspace-1034025/

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部