MySQL大小写敏感参数的一些内容
1.在MySQL中,可以通过lower_case_table_names=0/1来设置是否区分大小写,0代表区分大小写,1代表不分区大小写。
2.在MySQL5.7及之前的版本中,你可以在配置文件里随意修改这个参数的值。但是在MySQL8.0版本中,这个值只能在数据库初始化时指定一次,后续无法通过修改配置文件来变更这个值,比如在8.0的数据库中,初始化时指定了lower_case_table_names=0,数据库安装好后又通过配置文件指定了lower_case_table_names=1,这时数据库是起不来的。
3.当lower_case_table_names=0时,创建的数据库、表会按照创建时的大小写规则保存对应的数据文件到磁盘上,可以在MySQL的Data目录看到
严格按照SQL中指定的库表查询,如 select * from TestDB.TestTable; 如果数据库和表名是testdb.testtable,这时这个sql是查不到的。

4.当lower_case_table_names=1时,不管创建数据库、表的语句中是大写还是小写字母,会统一转化为小写字母存储数据到磁盘上
当程序发送过来的SQL中即包含大写字母,又包含小写字母,数据库会统一将它转化为小写,并去读取对应的库表。
4.1 当前的配置为不分区大小写
show variables like '%lower%';

4.2 TestDb与testdb两个库中均包含student表,TestDb中的为Student,testdb中的为student。两个表里的数据是一致的

4.3 在不区分大小写的情况下执行update TestDb.Student set age=38 where id='1';
查看原数据:select * from TestDb.Student;

执行update后,再查看数据。可以看到数据已经被修改了。但是此时到底修改的是TestDb.Student表里的数据还是testdb.student表里的数据呢?按照上述逻辑,在不区分大小写的情况下,mysql会将sql中的大写字母都转化为小写字母,那也就是说是修改的testdb.student表里的数据,TestDb.Student表里的数据是没有备修改的。验证这个观点的话,还需要把大小写敏感设置为0,也就是区分大小写才能验证出来。

4.4 修改大小写敏感参数为0,重启mysql
4.5 验证上述观点,根据结果可以得出结论,上述观点是没问题的

4.A库区分大小写→B库不分区大小写,在导出A的库数据导入B库时,B库中的所有库表都会转为小写,因为sql中的大写会统一转为小写。
5.如果在不区分大小写的情况下,数据库和表的名字都是大写,那sql转为小写后,还能查到吗?
验证:
5.1 大小写敏感为1,代表不分区大小写

5.2 数据库名字为TestDB,我通过如下的sql去查,都报没有库、表,由此可见在不区分大小写时,已存在的大写的库名、表名是无法查询到的。

结论:
在两个库中间做数据导入时,如果A库是区分大小写的,B库是不区分大小写的,这样是没什么问题的,这样导入到B库后所有的库、表名都会转为小写,程序查过来的sql也会被转为小写;
如果A库区分大小写,B库区分大小写,那这样也是没问题的;
如果A库区分大小写,数据导入B库之前,B库也区分大小写,导入数据后,B库改为了不区分大小写,那这个时候程序可就什么都查不到到了。同理,B库原先是不区分大小写的,导入数据后改为了区分大小写,这时候程序也是什么都查不到的。也就是说正在用的数据库,不要改这个参数,不然可能会导致sql查不到对应的库表。

浙公网安备 33010602011771号