MySQL 库名、表名、字段名区分大小写吗???

1,318 阅读6分钟

上周末写了一篇MySQL where查询字段值不区分大小写的文章(MySQL的where查询不区分字段大小写!!!),有个兄弟留言说经常遇到库名、表名、字段名的大小写问题。我想既然研究了大小写的问题,那就干脆研究彻底一点。

那么这一篇就再和大家一起详细聊聊“MySQL的大小写问题——库名、表名、字段名”。

说道库名、表名的大小写问题,就不得不聊 MySQL 的文件存储了。

MySQL 文件存储

首先看一下杨公子的MySQL实例中有哪些库、哪些表。

那么这些表的数据都存放在哪里呢?每个MySQL的数据存储位置都可能不同,如果你不知道你的MySQL数据文件的存储和路径,只需要执行这条命令:

show global variables like "%datadir%";

可以看到我的MySQL 的存储路径就是/var/lib/mysql了。

再去MySQL数据存储路径下看看,数据到底是怎么存放的。

和上面的库表相对应,可以很清楚的看到,这些标红的文件夹,存放的就是每一个库的数据。数据库文件夹example下面这些.ibd后缀名的文件就是数据库 example 下每张表的数据文件。

到这里大家应该能总结出一个规律了,那就是:

  • MySQL的每个数据库都对应存放在所在操作系统的文件系统中一个与数据库同名的文件夹中。

  • MySQL的每张表都对应存放在一个或多个与表同名的文件中(该文件所在文件夹就是与表所属库同名的文件夹)。

注:MySQL 的数据存储原理还有很多内容,以后有机会杨公子再细细和大家一起来探讨。这篇文章就不和大家展开了。

到底大小写敏感不敏感

现在我们知道了,MySQL中库表的数据都是存储在操作系统的文件系统中的,而且对应的文件夹或文件命名和MySQL的库表名称相同,所以操作系统的大小写是否敏感决定了数据库大小写是否敏感。

那么我们来看看常用的三种操作系统对大小写是不是敏感呢?

  • Windows是对大小写不敏感的;

  • Linux是对大小写敏感的

  • Mac系统默认是大小写不敏感的(不过可以设置为大小写敏感)。

如果是从客户那里获得的远程库,不知道MySQL部署在什么操作系统上,想查看MySQL所在操作系统对大小写是否敏感、查看MySQL是否大小写敏感该怎么办呢?

不要着急,只需要执行下面这条命令就好了。

show variables like 'lower%';

我们看到查出来的是两个参数名称和它们对应的值,那这两个参数分别是什么意思呢?杨公子带你慢慢研究。

参数 lower_case_file_system 表示数据目录所在的文件系统对文件名的大小写是否敏感。可取值有:NO、OFF。并且这是一个只读参数,无法被修改。

  • ON表示该文件系统对文件名的大小写不敏感;

  • OFF表示该文件系统对文件名的大小写敏感。

参数 lower_case_table_names 表示 Mysql设置大小写是否敏感。可取值有:0、1、2。这个参数不可以动态修改,修改后必须重启数据库才能生效。

  • 当值为0时。使用CREATE TABLE或CREATE DATABASE语句指定的大小写字母在硬盘上保存表名和数据库名。名称比较时对大小写敏感。在大小写不敏感的操作系统如windows或Max OS x上我们不能将参数设为0,如果在大小写不敏感的文件系统上将“lower_case_table_names”强制设置为0,并使用不同的大小写访问MyISAM表名,可能会导致索引破坏。

  • 当值为1时。表名和数据库名在硬盘上以小写保存,名称比较对大小写不敏感。MySQL将所有表名和数据库名转换为小写存储和查找表上。该行为也适合数据库名和表的别名,该值为Windows的默认值。

  • 当值为2时。表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写字母进行保存,但MySQL将它们转换为小写在查找表上。名称比较对大小写不敏感,即按照大小写来保存,按照小写来比较。注意:只在对大小写不敏感的文件系统上适用!innodb表名用小写保存。

既然 lower_case_table_names 是一个可以修改的参数,那么怎么修改它呢?

非常简单,只需要按照你的需要,更改数据库参数文件my.cnf,在mysqld下 添加或修改 lower_case_table_names = 1,之后重启数据库就可以生效了。

忘了字段名吗

看到这里,还记得文章标题的同学可能想问杨公子了,说好的讨论库名、表名、字段名的大小写敏感问题吗?都写了这么多库名和表名的大小写敏感了,字段名是不是给忘了?

当然没有,杨公子记着呢。这就为大家解答字段名到底大小写敏感不敏感。

答案很简单——字段名大小写不敏感

原因也很简单,因为字段名并不像库名、表名那样和操作系统的文件系统有密切的联系。所以字段名默认都是大小写不敏感的。

最 后

最后,我们来回顾总结一下。

  • 字段名、字段别名、索引名、存储过程名……,只要不涉及目录和文件,任何平台都不分大小写;

  • Windows平台,数据库名、表名、表别名、触发器名等,也不分大小写;

  • Unix, Linux平台,数据库名、表名、表别名、触发器名等,就要区分大小写了

为了防止出现相同的代码在不同平台出现异常的情况,杨公子给出两种建议:

  1. 涉及到数据库、表、字段、触发器的命名,一律用小写;
  2. 在my.ini的[mysqld]段,加上“lower_case_table_names=1”。

好了,这篇文章到这里也要结束了,杨公子在这篇文章里和大家一起仔细地分析了“MySQL 库名、表名、字段名是否大小写敏感”的问题。相信大家现在对MySQL的大小写问题都有了清楚的认识,以后也能根据不同场景的不同需求来区分和使用相关的参数,完美地完成老板交代的任务了。