项目使用了QRTZ之后,在项目启动的时候经常会出现报错,报错信息为QRTZ_
开头的表不存在。但是登录数据库会发现这些表是存在的。
这种问题一般出现在MySQL的配置上,尤其是MySQL部署在Linux系统上的时候。因为Linux下MySQL默认是要区分表名大小写的。
MySQL是否对表名大小写敏感是由参数lower_case_table_names
决定的:
lower_case_table_names=0
区分大小写(即对表名大小写敏感),默认是这种设置。这样设置后,在MySQL里创建的表名带不带大写字母都没有影响,都可以正常读出和被引用,访问的时候也需要区分大小写。
lower_case_table_names=1
不区分大小写(即对表名大小写不敏感)。这样设置后,表名在硬盘上以小写保存,MySQL将所有表名转换为小写存储和查找表上。该行为也适合数据库名和表的别名。
也就是说,MySQL设置为不分区大小写后,创建库或表时,不管创建时使用大写字母,创建成功后,都是强制以小写保存!
变量lower_case_file_system
说明是否数据目录所在的文件系统对文件名的大小写敏感,其中:ON说明对文件名的大小写不敏感,OFF表示敏感。
参数说明(lower_case_table_names)
Lunix下默认值为0;Windows下默认值是1;MacOSX下默认值是2。
参数值 | 解释 |
---|---|
0 | 使用CREATE TABLE或CREATE DATABASE语句指定的大小写字母在硬盘上保存表名和数据库名。名称比较对大小写敏感。在大小写不敏感的操作系统如windows或Mac OS x上我们不能将该参数设为0,如果在大小写不敏感的文件系统上将--lowercase-table-names强制设为0,并且使用不同的大小写访问MyISAM表名,可能会导致索引破坏。 |
1 | 表名在硬盘上以小写保存,名称比较对大小写不敏感。MySQL将所有表名转换为小写在存储和查找表上。该行为也适合数据库名和表的别名。该值为Windows的默认值。 |
2 | 表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写字母进行保存,但MySQL将它们转换为小写在查找表上。名称比较对大小写不敏感,即按照大小写来保存,按照小写来比较。注释:只在对大小写不敏感的文件系统上适用! innodb表名用小写保存。 |
之所以经常出现这种报错可能的原因是:
QRTZ在创建表的时候,默认是使用全大写的表名进行建表的,此时MySQL被设置为区分大小写。而后将MySQL改为不区分大小写,QRTZ在执行SQL的时候,使用大写的表名进行查询,而MySQL会将大写表名转换成小写表名进行检索,而原来建的表都还是大写的形式。可能不太容易理解,简单说就是,MySQL并不会因为改了配置而对表名进行重命名,表名仍然是大写的形式保存,但是查询的时候却将表名转换成小写,自然找不到表。
解决方式:
- 将数据库改为大小写敏感模式,然后将表名重命名为小写。
- 将大写的表复制一次,这样MySQL就会以小写的形式保存。(推荐使用这种方式,因为重命名需要考虑所有大写的地方,容易出现疏漏)
简单说明一下重命名方式:
- 先在my.cnf里将lower_case_table_names参数再次调整为0,改成区分大小写
- 然后mysqladmin -uroot -p shutdown 以安全模式关闭数据库
- 登陆mysql数据库,"alter table 旧表名 rename 新表名" 将带大写字母的旧表改为小写表名
- 最后再启动MySQL即可
MyMySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
1)数据库名与表名是严格区分大小写的;
2)表的别名是严格区分大小写的;
3)列名与列的别名在所有的情况下均是忽略大小写的;
4)变量名也是严格区分大小写的;
5)MySQL在Windows下都不区分大小写,但是在Linux下默认是区分大小写的。
6)如果想在查询时区分字段值的大小写,则字段值需要设置BINARY属性,设置的方法有多种:
a)创建时设置:CREATE TABLE T(A VARCHAR(10) BINARY);b)使用alter修改
为了MySQL在所有操作系统之间保持兼容,最好在安装完成后就将MySQL设置为表名大小写不敏感。
Mysql表名大小写区分规则
1)linux下:
数据库名与表名是严格区分大小写的;
表的别名是严格区分大小写的;
列名与列的别名在所有的情况下均是忽略大小写的;
变量名也是严格区分大小写的;
2)windows下:
都不区分大小写
3)Mac OS下(非UFS卷):
都不区分大小写
由大小写敏感转换为不敏感方法
如果原来所建立库及表都是对大小写敏感的,想要转换为对大小写不敏感,主要需要进行如下3步:
1)将数据库数据通过mysqldump导出。
2)在my.cnf中更改lower_case_tables_name = 1,并重启mysql数据库。
3)将导出的数据导入mysql数据库。
注意事项
为了避免大小写引发的问题,一种推荐的命名规则是:在定义数据库、表、列的时候全部采用小写字母加下划线的方式,不使用任何大写字母。
在任何系统中可以使用lower_case_tables_name=1。使用该选项的不利之处是当使用SHOW TABLES或SHOW DATABASES时,看不出名字原来是用大写还是小写。
请注意在Unix中如果以前lower_case_tables_name = 0将lower_case_tables_name设置为1之前,重启mysqld之前,必须先将旧的数据库名和表名转换为小写。