1. 复现问题
今天把项目部署到测试环境【linux
系统】时,刚启动项目便报出如下错误:
[root@presto_sugon jqp] tail -fn 200 log.file
2022-08-25 09:20:17.313 INFO 78383 --- [ main] c.j.a.a.config.ActitytiDataSourceConfig : cpu numbers = 4
2022-08-25 09:20:19.009 ERROR 78383 --- [ main] o.a.e.impl.interceptor.CommandContext : Error while closing command context
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'jqp.ACT_GE_PROPERTY' doesn't exist
### The error may exist in org/activiti/db/mapping/entity/Property.xml
### The error may involve org.activiti.engine.impl.persistence.entity.PropertyEntity.selectProperty-Inline
### The error occurred while setting parameters
### SQL: select * from ACT_GE_PROPERTY where NAME_ = ?
### Cause: java.sql.SQLSyntaxErrorException: Table 'jqp.ACT_GE_PROPERTY' doesn't exist
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) ~[mybatis-3.3.0.jar!/:3.3.0]
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122) ~[mybatis-3.3.0.jar!/:3.3.0]
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113) ~[mybatis-3.3.0.jar!/:3.3.0]
执行如下查询语句:
select * from ACT_GE_PROPERTY where NAME_ = ?
报出的问题是Table 'jqp.ACT_GE_PROPERTY' doesn't exist
,翻译成中文是jqp.ACT_GE_PROPERTY表不存在
。
2. 分析问题
既然报出ACT_GE_PROPERTY
不存在,于是在我本地的数据库【window
系统】中执行如上SQL语句:
mysql> select * from ACT_GE_PROPERTY;
+----------------+------------------+------+
| NAME_ | VALUE_ | REV_ |
+----------------+------------------+------+
| next.dbid | 22501 | 10 |
| schema.history | create(5.22.0.0) | 1 |
| schema.version | 5.22.0.0 | 1 |
+----------------+------------------+------+
3 rows in set (0.01 sec)
发现可以查询到数据,但我本地的这张表是小写的,如下图所示:
mysql> SELECT table_name,table_type FROM information_schema.tables WHERE TABLE_SCHEMA = 'jqp' and TABLE_NAME = 'ACT_GE_PROPERTY';
+-----------------+------------+
| table_name | table_type |
+-----------------+------------+
| act_ge_property | BASE TABLE |
+-----------------+------------+
测试环境上的这张表也是小写的,而我的测试环境正是linux
系统,也就是说,测试环境的mysql
区分大小写。
正如我们所知道的那样,Windows
系统下的mysql
默认是不区分大小写的,但linux
系统默认是区分大小写的。
3. 解决问题
既然知道linux
系统区分大小写,我们便可以进行如下修改,让其不区分大小写。
- 通过命令查看
mysql
是否是区分大小写的
show variables like '%case_table%';
-
lower_case_table_names=0
:表示区分大小写,而测试环境正是0,因而区分大小写。 -
lower_case_table_names=1
:表示不区分大小写 -
lower_case_table_names=2
:表名存储为给定的大小写但是比较的时候是小写的
lower_case_table_names
默认值:
-
lunix
下为 0 -
Windows
下为 1 -
Mac OS X
下为 2
- 修改
lower_case_table_names
的值为1
- 通过
vim
编辑器修改/etc/my.cnf
文件
- 在
[mysqld]
下加上lower_case_table_names=1
- 退出保存
按下ESC
-> 按下:
-> 输入wq
回车即可
- 按如下指令重启
mysql
服务
systemctl stop mysql
systemctl start mysql
4. 补充window下如何区分mysql大小写
windows
下打开Mysql
目录下的my.ini
文件
- 打开运行窗口
【开始键】+ R
- 输入
services.msc
打开服务管理器
- 找到
Mysql
- 右键属性
- 找到
my.ini
文件目录
由上可知,我的my.ini
文件是在C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
-
找到后打开
my.ini
文件找到[mysqld]
,在后面加上lower_case_table_names=0
保存 -
在服务管理器中重启启动
Mysql
服务,就可以保存带有大小的表名了