博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL表名大小写敏感导致的问题
阅读量:6913 次
发布时间:2019-06-27

本文共 1676 字,大约阅读时间需要 5 分钟。

 

最近在项目中遇到一个比较奇怪的小问题。在开发过程中自己测试没有问题,但是提测后,测试的同时在测试一个功能时报错了,日志是:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'testdb.Emp' doesn't exist
  • 1

于是乎打开数据库客户端,发现testdb数据库有这张表,真是奇怪。项目本地测试还是没问题,纠结了半天,才留意到代码中表名是Emp,而数据库中是emp。原来是表名大小写敏感问题。之前一直没有在意这个问题。 

变量lower_case_table_names

为什么本地开发没问题,但是测试环境就提示表不存在呢?因为本地的windows开发环境,默认是大小写不敏感。而测试环境的linux是敏感的。 

本地windows我们执行命令,查看自己电脑中的mysql系统变量可以看到:

show variables like '%lower_case_table_names%';
  • 1

结果: 

这里写图片描述 
值为1,表示是大小写不敏感,而linux环境的mysql是0. 

修改变量lower_case_table_names

为什么会出现这个问题,主要是因为开发和测试环境不一致导致的,这也是有时测试环境完全没问题,一到生产就出诡异问题的原因之一。所以,我们除了让测试同事认真测试外,最好本地和测试环境还是一致。 

对当前这个问题,我们直接修改SQL中的Empemp即可解决问题,但是为了根本解决问题,我们还须修改mysql的环境变量,也就是将lower_case_table_names的值改为0. 
修改方法: 
1. 找到mysql的安装位置 
2. 找到主目录下的my.ini配置文件 
3. 在[mysqld]节点下添加lower_case_table_names=0 
4. 重启mysql服务 

在配置的时候,很可能遇到这些问题: 

Q:my.ini在哪? 
A:一般在安装路径下。之前我一直修改目录下的my.ini,重启还是无效。上网求助后,发现没有使用这个配置,而是在任务管理、服务中右键属性,看到可执行文件中指定的文件: 
这里写图片描述 
Q:为什么修改了属性后,服务启动不了了。 
A:在一台电脑中MySQL成功启动,但是另一台一直启动不了。初步确定是操作系统的原因,一台是win7启动不了。另一台win10能够修改后启动并生效。最终win7那台设置了2才启动成功。 
原因:

 

Use lower_case_table_names=0 on Unix and lower_case_table_names=2 on Windows 

为什么windows不能取0?

官方文档给出了答案,说白了就是操作系统是不支持大小写敏感的文件系统。

You should not set lower_case_table_names to 0 if you are running MySQL on a system where the data directory resides on a case-insensitive file system (such as on Windows or OS X).

我们可以测试一下,在D盘建一个文件,命名为test.txt,再建一个文件夹叫Test.txt。我们会得到一串提示,操作系统把test和Test当做相同的字符串了: 

这里写图片描述

在下面将取值范围时,我们会看到0和2的区别。

 

变量lower_case_table_names的取值

取值范围有三个,分别是0、1、2. 

1. 设置成0:表名按你写的SQL大小写存储,大写就大写小写就小写,比较时大小写敏感。 
2. 设置成1:表名转小写后存储到硬盘,比较时大小写不敏感。 
3. 设置成2:表名按你写的SQL大小写存储,大写就大写小写就小写,比较时统一转小写比较。

这个选项不仅仅适用于表名的大小写敏感,同样适用于数据库名和表别名。

更多的资料,可以参考官方文档系统变量部分:

文章标签: 
你可能感兴趣的文章
30年分布,30年集中——高校认证计费的变革
查看>>
我的友情链接
查看>>
使用Cobbler2.4.0批量自动安装Esxi5.5
查看>>
我的友情链接
查看>>
Nagios 系统监控
查看>>
Python-w3
查看>>
解决Python开发过程中依赖库打包问题的方法
查看>>
jpeg note
查看>>
一个例子告诉你什么是CLR(JVM同理),以及版本兼容
查看>>
文章记录
查看>>
springAop
查看>>
AJAX入门学习-1:理解ajax
查看>>
ESXi中的虚拟机如何使用U盘
查看>>
把别人的Tcl/Tk代码加入到Go语言里13 游戏6 消除方块
查看>>
关于linux hrtimer高精度定时器的使用注意事项
查看>>
高清视频教程网站的搭建和分享
查看>>
Android 混淆代码总结
查看>>
Spark 二次排序
查看>>
zend studio中vim的安装
查看>>
实施微服务,我们需要哪些基础框架
查看>>