关于MySQL库表名大小写问题

前言:
一般在数据库使用规范中,我们都会看到这么一条:库名及表名一律使用小写英文 。你有没有思考过,为什么推荐使用小写呢?库表名是否应该区分大小写呢?带着这些疑问,我们一起来看下本篇文章 。
1.决定大小写是否敏感的参数在 MySQL 中,数据库与 data 目录中的目录相对应 。数据库中的每个表都对应于数据库目录中的至少一个文件(可能是多个文件,具体取决于存储引擎) 。因此,操作系统的大小写是否敏感决定了数据库大小写是否敏感,而 windows 系统是对大小写不敏感的,linux 系统对大小写敏感 。
默认情况下,库表名在 Windows 系统下是不区分大小写的,而在 Linux 系统下是区分大小写的 。列名,索引名,存储过程、函数及事件名称在任何操作系统下都不区分大小写,列别名也不区分大小写 。
除此之外,MySQL 还提供了 lower_case_table_names 系统变量,该参数会影响表和数据库名称在磁盘上的存储方式以及在 MySQL 中的使用方式,在 Linux 系统,该参数默认为 0,在 Windows 系统,默认值为 1,在 macOS 系统,默认值为 2。下面再来看下各个值的具体含义:
Value
Meaning
0
库表名以创建语句中指定的字母大小写存储在磁盘上,名称比较区分大小写 。
1
【关于MySQL库表名大小写问题】库表名以小写形式存储在磁盘上,名称比较不区分大小写 。MySQL 在存储和查找时将所有表名转换为小写 。此行为也适用于数据库名称和表别名 。
2
库表名以创建语句中指定的字母大小写存储在磁盘上,但是 MySQL 在查找时将它们转换为小写 。名称比较不区分大小写 。
一般很少将 lower_case_table_names 参数设置为 2,下面仅讨论设为 0 或 1 的情况 。Linux 系统下默认为 0 即区分大小写,我们来看下 lower_case_table_names 为 0 时数据库的具体表现:
# 查看参数设置mysql> show variables like 'lower_case_table_names';+------------------------+-------+| Variable_name| Value |+------------------------+-------+| lower_case_table_names | 0|+------------------------+-------+# 创建数据库mysql> create database TestDb;Query OK, 1 row affected (0.01 sec)mysql> create database testdb;Query OK, 1 row affected (0.02 sec)mysql> show databases;+--------------------+| Database|+--------------------+| information_schema || TestDb|| mysql|| performance_schema || sys|| testdb|+--------------------+mysql> use testdb;Database changedmysql> use TestDb;Database changedmysql> use TESTDB;ERROR 1049 (42000): Unknown database 'TESTDB'# 创建表mysql> CREATE TABLE if not exists `test_tb` (->`increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',->`stu_id` int(11) NOT NULL COMMENT '学号',->`stu_name` varchar(20) DEFAULT NULL COMMENT '学生姓名',->PRIMARY KEY (`increment_id`),->UNIQUE KEY `uk_stu_id` (`stu_id`) USING BTREE-> ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COMMENT='test_tb';Query OK, 0 rows affected (0.06 sec)mysql> CREATE TABLE if not exists `Student_Info` (->`increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',->`Stu_id` int(11) NOT NULL COMMENT '学号',->`Stu_name` varchar(20) DEFAULT NULL COMMENT '学生姓名',->PRIMARY KEY (`increment_id`),->UNIQUE KEY `uk_stu_id` (`Stu_id`) USING BTREE-> ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COMMENT='Student_Info';Query OK, 0 rows affected (0.06 sec)mysql> show tables;+------------------+| Tables_in_testdb |+------------------+| Student_Info|| test_tb|+------------------+# 查询表mysql> select Stu_id,Stu_name from test_tb limit 1;+--------+----------+| Stu_id | Stu_name |+--------+----------+|1001 | from1|+--------+----------+1 row in set (0.00 sec)mysql> select stu_id,stu_name from test_tb limit 1;+--------+----------+| stu_id | stu_name |+--------+----------+|1001 | from1|+--------+----------+mysql> select stu_id,stu_name from Test_tb;ERROR 1146 (42S02): Table 'testdb.Test_tb' doesn't existmysql> select Stu_id,Stu_name from test_tb as A where A.Stu_id = 1001; +--------+----------+| Stu_id | Stu_name |+--------+----------+|1001 | from1|+--------+----------+1 row in set (0.00 sec)mysql> select Stu_id,Stu_name from test_tb as A where a.Stu_id = 1001;ERROR 1054 (42S22): Unknown column 'a.Stu_id' in 'where clause'# 查看磁盘上的目录及文件[root@localhost ~]#:/var/lib/mysql# ls -lhtotal 616Mdrwxr-x--- 2 mysql mysql20 Jun3 14:25 TestDb...drwxr-x--- 2 mysql mysql144 Jun3 14:40 testdb[root@localhost ~]#:/var/lib/mysql# cd testdb/[root@localhost ~]#:/var/lib/mysql/testdb# ls -lhtotal 376K-rw-r----- 1 mysql mysql 8.6K Jun3 14:33 Student_Info.frm-rw-r----- 1 mysql mysql 112K Jun3 14:33 Student_Info.ibd-rw-r----- 1 mysql mysql 8.6K Jun3 14:40 TEST_TB.frm-rw-r----- 1 mysql mysql 112K Jun3 14:40 TEST_TB.ibd-rw-r----- 1 mysql mysql67 Jun3 14:25 db.opt-rw-r----- 1 mysql mysql 8.6K Jun3 14:30 test_tb.frm-rw-r----- 1 mysql mysql 112K Jun3 14:30 test_tb.ibd


推荐阅读