项目使用了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并不会因为改了配置而对表名进行重命名,表名仍然是大写的形式保存,但是查询的时候却将表名转换成小写,自然找不到表。 **解决方式:** 1. 将数据库改为大小写敏感模式,然后将表名重命名为小写。 2. 将大写的表复制一次,这样MySQL就会以小写的形式保存。(推荐使用这种方式,因为重命名需要考虑所有大写的地方,容易出现疏漏) *简单说明一下重命名方式*: 1. 先在my.cnf里将lower_case_table_names参数再次调整为0,改成区分大小写 2. 然后mysqladmin -uroot -p shutdown 以安全模式关闭数据库 3. 登陆mysql数据库,"alter table 旧表名 rename 新表名" 将带大写字母的旧表改为小写表名 4. 最后再启动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之前,必须先将旧的数据库名和表名转换为小写。 Loading... 项目使用了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并不会因为改了配置而对表名进行重命名,表名仍然是大写的形式保存,但是查询的时候却将表名转换成小写,自然找不到表。 **解决方式:** 1. 将数据库改为大小写敏感模式,然后将表名重命名为小写。 2. 将大写的表复制一次,这样MySQL就会以小写的形式保存。(推荐使用这种方式,因为重命名需要考虑所有大写的地方,容易出现疏漏) *简单说明一下重命名方式*: 1. 先在my.cnf里将lower_case_table_names参数再次调整为0,改成区分大小写 2. 然后mysqladmin -uroot -p shutdown 以安全模式关闭数据库 3. 登陆mysql数据库,"alter table 旧表名 rename 新表名" 将带大写字母的旧表改为小写表名 4. 最后再启动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之前,必须先将旧的数据库名和表名转换为小写。 最后修改:2023 年 08 月 02 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 2 如果觉得我的文章对你有用,请随意赞赏