问题描述
最近把网站向一台新的CentOS服务器中做迁移,把MySQL数据库和前后端站点全都部署完成后,网站启动之后一直在报表名不存在
的错误。
开始略微疑惑,以为是做数据库备份的时候漏了表,检查后发现并不是这么回事。
略一思索,想起来很久之前其实遇到过这个问题,这是由于MySQL数据库大小写敏感
引起的。
MySQL在Windows系统中是不区分大小写的,但是在Linux系统中默认是区分大小写的。这时候如果稍微不注意就会出错。
在MySQL数据库中,大小写敏感的配置和两个参数有关,lower_case_file_system
和 lower_case_table_names
。
我们可以在MySQL中使用下面的命令查询这两个参数:
1、lower_case_file_system:
- 只读变量,描述当前操作系统的文件目录是否区分大小写。 OFF表示文件名区分大小写,ON表示它们不区分大小写。
2、lower_case_table_names,代表表名是否大小写敏感,可以修改,参数有0、1、2三种。
- 0 大小写敏感。(Unix,Linux默认) 创建的库表将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录,create table AbCCC …将会原样生成AbCCC.frm文件,SQL语句也会原样解析。
- 1 大小写不敏感。(Windows默认) 创建的库表时,MySQL将所有的库表名转换成小写存储在磁盘上。 SQL语句同样会将库表名转换成小写。 如需要查询以前创建的Testtable(生成Testtable.frm文件),即便执行select * from Testtable,也会被转换成select * from testtable,致使报错表不存在。
- 2 大小写不敏感(OS X默认) 创建的库表将原样保存在磁盘上, 但SQL语句将库表名转换成小写。
如何解决
在Linux系统中,MySQL的配置文件一般在/etc/my.cnf
这个文件中,这时候我们只需要在配置文件的[mysqld]
下面加上一行参数就可以:
lower_case_table_names=1
注意事项
从上面lower_case_table_names
参数的值可以看出来,不同操作系统重对于大小写敏感的默认设置是不一致的,所以我们在开发时,SQL语句最好一律采用小写字母,避免出现错误。