MySQL中lower_case_table_names不会改变
在本文中,我们将探讨MySQL数据库在lower_case_table_names参数设定下,表名大小写不敏感的情况。
在MySQL中,lower_case_table_names参数可以设置为0、1或2。当该参数设置为0时,表示表名区分大小写,存储在磁盘中的表名与定义中的表名必须大小写一致,如”myTable”与”mytable”被视为不同的表;当该参数设置为1时,表名将不区分大小写,”myTable”与”mytable”被视为相同的表,但在存储时,MySQL将始终将表名存储为定义中的形式,即”myTable”。当该参数设置为2时,表名不区分大小写,并将表名存储为小写形式,即”mytable”,无论在定义中使用大写还是小写字母。
虽然在lower_case_table_names参数为1时,做查询和更新操作时表名不区分大小写,但是在MySQL中,对于不同大小写的表名,仍然可以使用该表的大小写,例如:
CREATE TABLE myTable (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
SELECT * FROM myTable; --正确语法
SELECT * FROM mytable; --也可以工作
上述查询语句都可以正确地返回myTable表中的数据。
然而,当lower_case_table_names参数设置为1时,在使用模糊查询时,可能会出现不必要的麻烦。例如,以下查询语句将返回0行:
SELECT * FROM myTable WHERE name LIKE 'my%';
这是因为表名在存储时为”myTable”,而模糊查询时要求表名为”mytable”。因此,在使用lower_case_table_names参数时,使用模糊查询时需要非常小心。
除此之外,lower_case_table_names参数的设置还会影响到通过外键引用表的情况。例如,在设置为1的情况下,以下查询将返回0行:
SELECT * FROM myTable JOIN otherTable ON myTable.id = otherTable.myTableId;
这是因为在otherTable中,外键myTableId必须引用大小写与定义中的myTable完全一致的表,而在查询中使用的表名与定义中的表名不同。当把lower_case_table_names参数设置为0或2时,查询将会正常返回myTable与otherTable的联接结果。
阅读更多:MySQL 教程
总结
MySQL中的lower_case_table_names参数可以影响到表名大小写的区分方式,但在设定后需要注意模糊查询和外键引用的情况。为了避免出现不必要的错误,需要根据具体情况谨慎设置该参数。