背景:由于项目开始时数据库设计经验不足,数据库名和部分数据表名都含有大写字母。但问题是,Linux上数据库名和表名是区分大小写的,而Windows上是不区分大小写的。结果就是在看本地的数据库的时候,对着写的代码是小写的表名,后来传到服务器上却发现报错,几经审查才发觉是表名的大小写不统一的问题。真是天坑啊,坑了自己也坑了小伙伴。怎么办呢?代码已经比较多了,不太可能一下子就把代码里面的表名都改过来。网上看到说设置 lower_case_table_names 可以使Linux上的数据库表名不区分大小写,那就试试吧。
ACTION1:直接修改服务器上 lower_case_table_names=1并重启 ,结果网站挂掉了,说找不到数据库!而本地通过MySQL-Front连接到服务器,显示有小写的 awzthink,但是点进去却说 "awzthink"数据库不存在 这样的话。第一次尝试失败,只能把配置先改回来,网站继续运行。
分析:这样看来,似乎代码本来用的大写awzThink和远程工具用的全小写awzthink都找不到那个数据库,那就想到直接把数据库名直接改为全小写。但是MySQL并没有提供修改数据库名的功能,所以只能新建数据库以及配置数据库用户,然后把所有数据表复制过去,再修改代码中的数据库配置。因为白天网站有一定流量,于是把这项任务安排是深夜。
ACTION2:是夜月黑风高,在服务器上把数据表复制到新的数据库中去,修改代码中的数据库配置(就只有一行),然后修改数据库自动备份脚本,上传。OK,网站运行正常,数据导出来查看也没有出入。再次尝试设置 lower_case_table_names=1并重启,结果那些有大写字母的表还是查询不出来,只好把此配置改回来。
分析:到这一步,数据库名已经改为小写,虽说对代码优化还是没什么帮助,但想要设置lower_case_table_names还是得必须经过这一步,就是必要不充分条件。对于为什么配置这个选项还是没有把传说中的大小写问题修好,还是要详细了解lower_case_table_names这个参数是做什么用的。
分析:后来百度搜索到ITEYE上的一篇博文,终于大概明白是怎么一回事。简单归纳就是:为0时(Linux默认),大小写敏感,创建和查询都是区分大小写;为1时,创建表以小写,查询表也是以小写;为2时,创建表区分大小写,查询表以小写。这样说的话应该就明白了,在Linux上如果本来是以有大写字母创建的表和数据库,如果后来配置设置为1或2时,那么就无论如何都查询不出来了。这个只对表名和数据库名,字段名是所有系统都区分大小写。所以解决办法是,修改表名为小写,然后设置lower_case_table_names=1并重启
ACTION3:再到凌晨,先截图保存现在的数据库表名,在网站低峰期修改表名为小写,再修改这个配置项,然后重启MySQL。注意修改表名到重启MySQL成功之前这一段时间,代码运行是会报错的。重启MySQL之后,网站就可以正常运行了。而代码中的SQL语句表名比较多而繁杂,可以对着截图以后慢慢改。
END:扫地完毕,小伙伴们可以安心地写MySQL了,不用再烦恼大小写问题了。对于原来代码中的大写表名,等闲一点再批量查找修改吧。
附:修改lower_case_tables_names配置项的方法>>>
1、ROOT用户登录,vi /etc/my.cnf
2、找到 [mysqld],在里面加入一行 lower_case_table_names=1
3、重启数据库 service mysqld restart