数据库大小写敏感问题

时间:2022-05-31 00:51:30

Oracle

            默认是大小写不敏感,表名、字段名等不区分大小写,小写字母会自动转换为大写字母; 需要用小写字母时需要使用双引号,或借助函數upper()和lower();

PostgreSQL

            默认是大小写不敏感,表名、字段名等不区分大小写,大写字母会自动转换为小写字母; 需要用大写字母时需要使用双引号,或借助函數upper()和lower();

SQLServer

           默认是大小写不敏感; 可以通过修改排序规则改变: 右击数据库--->属性----->选项---->排序规则: Chinese_PRC_CS_AS 区分大小写、 Chinese_PRC_CI_AS 不区分大小写。

MySQL

           在Linux下数据库名、表名、列名、别名大小写规则是这样的: 

            1、数据库名与表名是严格区分大小写的;

            2、表的别名是严格区分大小写的;

            3、列名与列的别名在所有的情况下均是忽略大小写的; 

            4、变量名也是严格区分大小写的; 

            MySQL在Windows下都不区分大小写

           所以在不同操作系统中为了能使程序和数据库都能正常运行,最好的办法是在设计的时候都转为小写,但是如果在设计的时候已经规范化大小写了,那么在Windows环境下只要对数据库的配置做下改动就行了,具体操作如下: 在MySQL的配置文件中my.ini [mysqld] 中增加一行 lower_case_table_names = 1 参数解释: 0:区分大小写 1:不区分大小写。

            在MySQL 中,数据库和表就对于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。奇怪的是列名与列的别名在所有的情况下均是忽略大小写的,而表的别名又是区分大小写的。

             要避免这个问题,你最好在定义数据库命名规则的时候就全部采用小写字母加下划线的组合,而不使用任何的大写字母。

SQLite:

         大小写敏感,具体:

         1.创建表、列的时候,SQL语句里是什么大小写,表名、列名就是什么大小写;

         2.SQL语句执行的时候:表名、列名大小写不敏感,都能识别;

         3.SQL语句里面,“=”还是 LIKE 都是大小写敏感;

         那么SQLite怎么区分大小写查询呢,以下是三种解决方案:

        方案一:使用大小写转换函数LOWER、UPPER
        1.select * from test where lower(name) = 'abcde';
        2.select * from test where lower(name) = lower('ABCDE');

        (1).select * from test where upper(name) = upper('Abcde');

         .........

        备注:lower() 、upper()为sqlite里面函数

        方案二:在进行比较时强制声明不区分大小写
        select * from test where name = 'ABCDE' COLLATE NOCASE;
        方案三:创建表时声明该字段不区分大小写
        create table test (_id Integer,name Text COLLATE NOCASE );

说明:
1.如果在任何情况下都不需要对大小写敏感,方案三是最好的解决方案;
2.如果只是少量查询对大小写不敏感,可以用方案二。
3.而方案一由于用到了函数,可能有额外的性能消耗,不推荐使用。

SELECT * FROM User WHERE account = 'asdf';
select * from User where account = 'asdf';
Select * From USER WHERe ACCOUNT = 'asdf';
SELECT * FROM User WHERE lower(account) = lower('asdf');
SELECT * FROM User WHERE account = 'asdf' COLLATE NOCASE;