• 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

    原文链接

  • 相关阅读:
    Python环境搭建详解(Window平台)
    扎心了Python
    解决Git
    Android入门教程(四)
    HEXO快速搭建自己的博客
    每日Android一问等你来解答-什么是Activity的生命周期?
    如何才能够系统地学习Java并发技术?
    LeetCode刷题指南(字符串)
    学生时代的最后一个新年,请一定要做这五件事
    20位程序员关于求职的疑问,以及我给出的参考答案
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/13172832.html
Copyright © 2020-2023  润新知