今天帮朋友部署一个系统到Linux服务器。一部署上去就发现log上有错误,错误信息显示某些表找不到。对比了一下错误信息和MySQL上的表结构,发现两边的表名大小不一致,程序里用的是大写,MySQL里面都是小写。看起来应该就是大小写的问题了。
Google了一下,果然是这样,Linux版本的MySQL默认是大小写敏感的,所以就会出现找不到表的问题。这套系统本来是在Windows下开发的,Windows版本的MySQL是大小写不敏感的,所以他们开发部署的时候也不会碰到这种问题。这种问题只有大小写混用,跨系统的时候才可能会产生。
找到了问题,接下来就说说跟这个问题有关的配置项。
MySQL有个 lower_case_table_names 的配置项,主要含义有两个:1、在文件系统中怎么保存数据;2、MySQL在对比的时候是不是大小写敏感。
例如,在MySQL中创建一张表: create table Test,不同的 lower_case_table_names 值,会有不一样的存储和对比方式。
lower_case_table_names 值 | 如何存储 | 对比时大小写敏感 |
---|---|---|
0 | 按照DML中的来,存储为Test。Unix/Linux默认值 | 敏感,查询时要用Test |
1 | 存储为小写字母,test。Windows默认值 | 不敏感,MySQL在对比时都转化为小写 |
2 | 按照DML中的来,存储为Test。Mac默认值 | 不敏感,MySQL在对比时都转化为小写 |
参考: https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html