Mysql在开发过程中遇到大小写的问题

119 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

前言

我们在业务的开发过程有些业务场景,避免不了去手写sql语句,包括多表的关联查询,或者嵌套查询等… 我们通常多表查询,都会在表名后面加一个别名,方便通过这个别名点它的字段去关联查询,但是我最近开发遇到一个问题,就是这个别名大小写的问题,让我们看看mysql中到底区不区分大小写。

问题情况

SELECT
    count(*)
FROM
    payable_fee P
WHERE
    EXISTS (
            SELECT
                business_no
            FROM
                company_batch_statement_payable_item t
            WHERE
                p.payable_fee_no = t.business_no
              AND `enable` = 1
        )
  AND p.batch_no = '31223131'
  AND `enable` =1

这是我写的一个sql语句,主要是来校验数据是否存在,这里面我使用EXISTS函数来判断目标数据是否存在,下面我来执行下这条sql语句看看会有什么问题。

54DDC6C3-4799-4ACE-A256-59A0CF6CB4B4.png

可以看到执行结果count为0正常不存在,sql执行没有什么问题。 下面我们再来执行下

03A14F06-3B22-4C03-BD3F-CABFBDFFAD33.png

可以看到问题出来了,竟然找不到p.payable_fee_no 这个列,细心的同学可以看到 payable_fee P ,这个字母P我写成了大写,下面竟然找不到了,为什么上面执行没有问题,下面的执行会报错呢,其实我们同样的sql在两个库里面执行,上面是开发库,下面是测试库。

Mysql表名规则

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的: 1、数据库名与表名是严格区分大小写的; 2、表的别名是严格区分大小写的; 3、列名与列的别名在所有的情况下均是忽略大小写的;
4、变量名也是严格区分大小写的;

所以在上面的执行中,开发库的设置并没有遵循上述规则的第二条,才导致可以查询到结果。

解决方法:

在my.ini中的[mysqld]后添加添加lower_case_table_names=1,重启MYSQL服务,这时已设置成功:不区分表名的大小写; lower_case_table_names参数详解: lower_case_table_names = 0
其中 0:区分大小写,1:不区分大小写

总结

Mysql无论是库名、表名、字段名还是别名都是区分大小写的,所以在写sql的时候一定要细心,看清楚大小写,不要被自己的粗心给自己制造BUG,最后希望兄弟们能引以为戒写出更多优雅的BUG,开玩笑~