报错
今天引入 mybatis-plus ,在查表时出现如下错误,表找不到,但是库里是存在这张表的。
org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'ebook.category' doesn't exist
### The error may exist in cc/wanghl/ebook/mapper/CategoryMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT COUNT( * ) AS total FROM category WHERE id=?
### Cause: java.sql.SQLSyntaxErrorException: Table 'ebook.category' doesn't exist
; bad SQL grammar []
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:243) ~[spring-jdbc-6.0.11.jar:6.0.11]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) ~[spring-jdbc-6.0.11.jar:6.0.11]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92) ~[mybatis-spring-2.1.1.jar:2.1.1]
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439) ~[mybatis-spring-2.1.1.jar:2.1.1]
at jdk.proxy2/jdk.proxy2.$Proxy67.selectOne(Unknown Source) ~[na:na]
原因
可能的原因有很多,比如表名写错了、jdbc 链接中没有写数据库(如下图)
不过我的原因是,我的库里表名是大写的,mybatis-plus 发出的 sql 表名是小定的。
Mysql 我用的是官方的 docker 镜像 mysql:8.1.0 ,linux 版本的 mysql 默认是大小写敏感的。
用下面的命令可以查看你的 Mysql 关于大小写是否敏感的设置信息:
show global variables like '%lower_case%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | ON |
| lower_case_table_names | 0 |
+------------------------+-------+
lower_case_file_system,代表当前系统文件是否大小写敏感,只读参数,无法修改。ON 大小写不敏感,OFF 大小写敏感。
lower_case_table_names,代表表名是否大小写敏感,可以修改,参数有0、1、2三种。
- 0 大小写敏感。(Unix,Linux默认) 创建的库表将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录,create table AbCCC …将会原样生成AbCCC.frm文件,SQL语句也会原样解析。
- 1 大小写不敏感。(Windows默认) 创建的库表时,MySQL将所有的库表名转换成小写存储在磁盘上。 SQL语句同样会将库表名转换成小写。 如需要查询以前创建的Testtable(生成Testtable.frm文件),即便执行select * from Testtable,也会被转换成select * from testtable,致使报错表不存在。
- 2 大小写不敏感(OS X默认) 创建的库表将原样保存在磁盘上, 但SQL语句将库表名转换成小写。
解决
-
lower_case_table_names是可以改的,Linux 中 Mysql 的配置文件在/etc/my.cnf和/etc/mysql/conf.d/*.cnf -
在
[mysqld]类目下加一行lower_case_table_names = 1 -
这个方法在 Mysql8 版本会启动报错
Different lower_case_table_names settings for server ('1') and data dictionary ('0'). -
具体见网友的解决办法,需要实始化库,
mysql8默认是区分大小写的,如果不需要区分大小写则需要设置lower-case-table-names MySQL8启动报Different lower_case_table_names settings for server ('1') and data dictionary ('0'). 需要删除mysql的库重新初始化: mysqld --initialize --lower-case-table-names=1
并且修改/etc/my.cnf
在[mysqld]下面添加
lower-case-table-names=1
然后启动mysqld就可以了
-
懒得解决就把表名全改成小写吧。
参考文章: