【转】MySQL表名大小写敏感导致的问题
原文地址:https://blog.csdn.net/postnull/article/details/72455768
最近在项目中遇到一个比较奇怪的小问题。在开发过程中自己测试没有问题,但是提测后,测试的同时在测试一个功能时报错了,日志是:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'testdb.Emp' doesn't exist
于是乎打开数据库客户端,发现testdb数据库有这张表,真是奇怪。项目本地测试还是没问题,纠结了半天,才留意到代码中表名是Emp,而数据库中是emp。原来是表名大小写敏感问题。之前一直没有在意这个问题。
变量lower_case_table_names
为什么本地开发没问题,但是测试环境就提示表不存在呢?因为本地的windows开发环境,默认是大小写不敏感。而测试环境的linux是敏感的。
本地windows我们执行命令,查看自己电脑中的mysql系统变量可以看到:
show variables like '%lower_case_table_names%';
结果:
值为1,表示是大小写不敏感,而linux环境的mysql是0.
修改变量lower-case-table-names
为什么会出现这个问题,主要是因为开发和测试环境不一致导致的,这也是有时测试环境完全没问题,一到生产就出诡异问题的原因之一。所以,我们除了让测试同事认真测试外,最好本地和测试环境还是一致。
对当前这个问题,我们直接修改SQL中的Emp为emp即可解决问题,但是为了根本解决问题,我们还须修改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才启动成功。
原因:
https://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html
Use lower_case_table_names= on Unix and lower_case_table_names= on Windows
为什么windows不能取0?
官方文档给出了答案,说白了就是操作系统是不支持大小写敏感的文件系统。
You should not set lower_case_table_names to 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大小写存储,大写就大写小写就小写,比较时统一转小写比较。
这个选项不仅仅适用于表名的大小写敏感,同样适用于数据库名和表别名。
更多的资料,可以参考官方文档系统变量部分:
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_lower_case_table_names
【转】MySQL表名大小写敏感导致的问题的更多相关文章
- MySQL表名大小写敏感导致的问题
最近在项目中遇到一个比较奇怪的小问题.在开发过程中自己测试没有问题,但是提测后,测试的同时在测试一个功能时报错了,日志是: Caused by: com.mysql.jdbc.exceptions ...
- Linux系统下MySql表名大小写敏感问题
mysql是通过lower_case_table_names变量来处理大小写问题的. 首先查询该变量 mysql在Linux下数据库名.表名.列名.表别名大小写规则如下: 1.数据库名与表名严格区分大 ...
- (1.12)SQL优化——mysql表名、库名大小写敏感
mysql表名.库名大小写敏感 关键词:mysql大小写敏感
- linux中mysql表名默认区分大小写导致表找不到的问题
天将window的项目迁移到linux上面,然后登录时一直报用户表找不到的错误信息. 检查发现数据库中的表名是m_user, 后来才想起来是大小写问题, 找到问题原因,解决方案如下: 修改/etc/m ...
- mysql表名忽略大小写问题记录
问题描述:一开发同事在linux下调一个程序老是报错说找不到表,但是登陆mysql,show tables查看明明是已经创建了这张表的!!如下: mysql> show tables; +--- ...
- MySQL表名和数据库关键字相同解决办法
今天改他们的代码的时候,遇到了MySQL表名和数据库关键字的问题. 由于表名是关键字,导致增删改查都报错. Hibernate: select leave0_.id as id22_, leave0_ ...
- php大力力 [021节]mysql表名在mac下不能大写
2015-08-27 php大力力021.mysql表名在mac下不能大写 刚才数据库里面,phpMyAdmin狂出错. Some errors have been detected on the s ...
- mysql表名忽略大小写
安装完数据库,建表查询发现表不存在,原来是表名大小写写错了,原来Linux下的MySQL默认是区分表名大小写的,这样的话对变成灰带来很大的不变,如何才能使mysql表名不区分大小写呢? 通过如下设置, ...
- 转:MySQL表名不区分大小写
在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 一.linux中mysql大小写详情: 1.数据库名严格区分大小写 2.表名严格 ...
随机推荐
- php实现MySQL两库对比升级版
define('DATABASE1', 'db1'); $dbi1 = new DbMysql; $dbi1->dbh = 'mysql://root:password@127.0.0.1/'. ...
- 粒子跟随本体unity
Simulation Space(模拟空间):在世界坐标和本地坐标中切换,这个就是制作技能痕迹的重要位置,新建的粒子系统一般都默认为local,所以在粒子本体移动的时候也跟着进行移动,改为world的 ...
- windows无法卸载jdk的解决方法
装了java之后非常纠结的就是无法卸载,总不能因为卸载一个jdk去重装系统,但是看着它残存在那又非常不爽, 因为卸载会牵扯注册表等琐碎的东西,,,后来在官网发现神器一枚,此神器就是java卸载工具. ...
- 通用Mapper
原理是:拦截器 1.假设:使用MyBatis只需要定义Mapper接口,无需编写Mapper.xml文件 如果实现无需编写Mapper.xml文件,我们必须要实现动态拼接SQL 如何实现动态拼接SQL ...
- 2018.10.24 bzoj2064: 分裂(状压dp)
传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...
- mac os 下 Android Studio设置真机调试
http://www.cnblogs.com/developer-wang/p/6719555.html 如果没有 .bash_profile 只需要创建 .bash_profile,然后增加andr ...
- c++中typedef、define、const、inline之间的区别
1.typedef和#define的区别 typedef int* pInt; , b = ; const pInt p1 = &a; //p1是常量指针 pInt const p2 = &a ...
- servlet 解决乱码问题
对于servlet大家应该都很熟悉了,今天再复习一下,如果有哪里写的不好或不对的地点希望广大的网友批评指正.今天只讨论get和post两w种方式,他们之间有很多的不同点,所以解决编码的方式也会不一样, ...
- weblogic配置集群(二)
接到上一篇博文来 weblogic配置集群(一) 三.启动管理server 按照上面的方式创建好域后,在D:\Oracle\Middleware\user_projects\domains\gszhD ...
- 如果我写一个开源的HIS软件
HIS也称为医院信息管理系统,如果我要写一个 开源的,会成吗?为什么要这么做?出于对这个行业的担忧及其当前该行业的一些问题的思考.我曾跟两个HIS供应商讨论过这个话题,但可以感受到他们在利益面前,最终 ...