SQL SERVER 排序规则中的大小写敏感问题(转载)
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。
第二个问题
与数据库和字段的COLLATE属性有关。后者的单独设置可以覆盖数据库的全局设置。
库、字段都可以设置 collate 属性,但是表不能设置 collate 属性
查询数据库的大小写敏感设置
use [XXX] execute sp_server_info '16' SELECT case when 'A'='a' then 'case_insensitive' else 'case_sensitive' end
分类:
Sql Server
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2009-06-21 SQL SERVER 2005 SSAS 维度关系的优先级问题