今天软件商来部署应用,发现程序有问题,原因是他们给的数据库脚本中创建表的时候有大小写,但是程序里面读表的时候又没有严格的区分大小写,导致有些表找不到,因为Linux 的MySQL默认是区分大小写的,也就是lower_case_table_names=0,于是软件商要求我将该参数修改为lower_case_table_names=1,不然就只能回去修改程序了
为了别人方便,我想改就改吧,应该没啥影响,lower_case_table_names=是静态参数,只能修改my.cnf,并且还需要重启数据库,结果修改的时候只是改了主库,没有改从库,导致从库应用数据的时候报错,不得不重做从库
这里记录一下修改静态参数的顺序:如果是主从库环境的话,修改静态参数,静态参数指需要修改my.cnf配置文件的情况,应该先修改从库的配置文件,然后再修改主库的配置文件,等两边的参数一致了,再在主库上做其他的操作,这样从库应用就不会出错了
参数说明:
mysql> show variables like ‘%lower%‘;
+------------------------+-------+
| Variable_name | Value|
+------------------------+-------+
| lower_case_file_system | OFF|
| lower_case_table_names | 1 |
+------------------------+-------+
2 rows in set (0.00 sec)
lower_case_file_system 表示数据目录所在的文件系统是否对文件名的大小写敏感。ON说明对文件名的大小写不敏感,OFF表示敏感。
lower_case_table_names
0:区分大小写
1:不区分大小写,其实是将程序发送的所有大写字符改成小写字符存储,适用于数据库名和表名
说明:Windows系统对大小写不敏感,MySQL也默认设置为对大小写不敏感。Linux对大小写敏感,MySQL默认设置对大小写敏感。MySQL只是对库名、表名,变量名区分大小写,列名与列的别名在所有的情况下均是忽略大小写的
将大小写敏感转换为不敏感方法
如果原来所建立库及表都是对大小写敏感的,想要转换为对大小写不敏感,主要需要进行如下3步:
1.将数据库数据通过mysqldump导出。
2.在my.cnf中更改lower_case_tables_name = 1,并重启mysql数据库。
3.将导出的数据导入mysql数据库。
需要注意的地方:
1、为了避免大小写引发的问题,一种推荐的命名规则是:在定义数据库、表、列的时候全部采用小写字母加下划线的方式,不使用任何大写字母
2、在任何系统中可以使用lower_case_tables_name=1。但使用该选项的不利之处是当使用show tables 或show databases 时,看不出表名是用大写还是小写。
3、请注意在Linux中如果需要将lower_case_tables_name = 0,设置为lower_case_tables_name=1,再重启mysqld之前,必须先将旧的数据库名和表名转换为小写。否则之前大写的表会无法识别了