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

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才启动成功。 
原因:

https://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html 
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大小写存储,大写就大写小写就小写,比较时统一转小写比较。

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

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

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_lower_case_table_names

文章标签: mysql数据库

MySQL表名大小写敏感导致的问题的更多相关文章

  1. 【转】MySQL表名大小写敏感导致的问题

    原文地址:https://blog.csdn.net/postnull/article/details/72455768 最近在项目中遇到一个比较奇怪的小问题.在开发过程中自己测试没有问题,但是提测后 ...

  2. Linux系统下MySql表名大小写敏感问题

    mysql是通过lower_case_table_names变量来处理大小写问题的. 首先查询该变量 mysql在Linux下数据库名.表名.列名.表别名大小写规则如下: 1.数据库名与表名严格区分大 ...

  3. (1.12)SQL优化——mysql表名、库名大小写敏感

    mysql表名.库名大小写敏感 关键词:mysql大小写敏感

  4. linux中mysql表名默认区分大小写导致表找不到的问题

    天将window的项目迁移到linux上面,然后登录时一直报用户表找不到的错误信息. 检查发现数据库中的表名是m_user, 后来才想起来是大小写问题, 找到问题原因,解决方案如下: 修改/etc/m ...

  5. mysql表名忽略大小写问题记录

    问题描述:一开发同事在linux下调一个程序老是报错说找不到表,但是登陆mysql,show tables查看明明是已经创建了这张表的!!如下: mysql> show tables; +--- ...

  6. MySQL表名和数据库关键字相同解决办法

    今天改他们的代码的时候,遇到了MySQL表名和数据库关键字的问题. 由于表名是关键字,导致增删改查都报错. Hibernate: select leave0_.id as id22_, leave0_ ...

  7. php大力力 [021节]mysql表名在mac下不能大写

    2015-08-27 php大力力021.mysql表名在mac下不能大写 刚才数据库里面,phpMyAdmin狂出错. Some errors have been detected on the s ...

  8. mysql表名忽略大小写

    安装完数据库,建表查询发现表不存在,原来是表名大小写写错了,原来Linux下的MySQL默认是区分表名大小写的,这样的话对变成灰带来很大的不变,如何才能使mysql表名不区分大小写呢? 通过如下设置, ...

  9. 转:MySQL表名不区分大小写

    在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 一.linux中mysql大小写详情: 1.数据库名严格区分大小写 2.表名严格 ...

随机推荐

  1. 什么是 Event Loop?

    http://www.ruanyifeng.com/blog/2013/10/event_loop.html 什么是 Event Loop? 作者: 阮一峰 日期: 2013年10月21日 [2014 ...

  2. java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest

    错误信息 查看Console标签页: 这儿提示找不到HttpServletRequest类. 解决办法 规则文件更新的时候需要调用servlet-api.jar相关的类,如果您的系统环境下无法找到这个 ...

  3. JavaScript-undefined与null区别

    JavaScript中的null在其他编程语言中也很常见,但是JavaScript在设计的过程中null自动转换为0,为了更好表示空,这个时候undefined出现了,null通过typeof结果是“ ...

  4. 关于使用rem单位、css函数calc()进行自适应布局

    一.关于css中的单位 大家都知道在css中的单位,一般都包括有px,%,em等单位,另外css3新增加一个单位rem. 其中px,%等单位平时在传统布局当中使用的比较频繁,大家也比较熟悉,不过px单 ...

  5. 转:UFLDL_Tutorial 笔记(deep learning绝佳的入门资料 )

    http://blog.csdn.net/dinosoft/article/details/50103503 推荐一个deep learning绝佳的入门资料 * UFLDL(Unsupervised ...

  6. win7下使用Taste实现协同过滤算法

    如果要实现Taste算法,必备的条件是: 1) JDK,使用1.6版本.需要说明一下,因为要基于Eclipse构建,所以在设置path的值之前要先定义JAVA_HOME变量. 2) Maven,使用2 ...

  7. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十七)Elasticsearch-6.2.2集群安装,组件安装

    1.集群安装es ES内部索引原理: <时间序列数据库的秘密(1)—— 介绍> <时间序列数据库的秘密 (2)——索引> <时间序列数据库的秘密(3)——加载和分布式计算 ...

  8. Magento错误 Illegal scheme supplied, only alphanumeric characters are permitted

    1.检查表core_config_data 'web/unsecure/base_url' 和'web/secure/base_url' 的值是否是正确的链接地址 2.删除系统目录var下所有子目录及 ...

  9. 10gocm-&gt;session3-&gt;数据备份与恢复

    这个实验考查我们当数据库出现问题宕机.数据丢失的情况下怎样挽回我们的损失,怎样在最短时间内恢复我们的数据库服务. RMAN规划 host target库 catalog库 ocm01 ocmdb   ...

  10. 与IE的战斗

    对第2版的改进,工作量几乎都在UI上,不断的写css,写js,还别说,总体挺愉快的.特别是把360浏览器用顺了之后,烦人的无法刷新问题也不能困扰我了,改了js或者css文件的话,只要清除一下缓存,就可 ...