持续创作,加速成长!这是我参与「掘金日新计划 · 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语句看看会有什么问题。
可以看到执行结果count为0正常不存在,sql执行没有什么问题。 下面我们再来执行下
可以看到问题出来了,竟然找不到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,开玩笑~