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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> show tables;
+ -------------------------------------------+
| Tables_in_huan_db                         |
+ -------------------------------------------+
| advertisement                             |
| message_queue                             |
| message_sys_user                          |
| message_user                              |
| opHistory                                 |
| opHistory_queue                           |
| opHistory_queue_result_log                |
| opHistory_queue_send_fail_log             |
+ -------------------------------------------+
rows  in  set  (0.00 sec)
 
mysql>  desc  opHistory;
ERROR 1146 (42S02):  Table  'haun_db.opHistory'  doesn 't exist
mysql> desc opHistory_queue;
ERROR 1146 (42S02): Table ' haun_db.opHistory_queue ' doesn' t exist
mysql>  desc  opHistory_queue_result_log;
ERROR 1146 (42S02):  Table  'haun_db.opHistory'  doesn 't exist
mysql> desc opHistory_queue_send_fail_log;
ERROR 1146 (42S02): Table ' haun_db.opHistory_queue_send_fail_log ' doesn' t exist

这张表明明存在,为什么程序就找不到表呢??

原因查找:
因为linux下mysql默认是要区分表名大小写的。mysql是否区分大小写设置是由参数lower_case_table_names决定的,其中:
1)lower_case_table_names = 0 
区分大小写即对大小写不敏感),默认是这种设置。这样设置后,在mysql里创建的表名带不带大写字母都没有影响,都可以正常读出和被引用。

1
2
3
4
5
6
7
8
mysql> show variables  like  "%case%" ;
+ ------------------------+-------+
| Variable_name          | Value |
+ ------------------------+-------+
| lower_case_file_system |  ON     |
| lower_case_table_names | 0     |
+ ------------------------+-------+
rows  in  set  (0.00 sec)

2)lower_case_table_names = 1 
不区分大小写即对大小写敏感)。这样设置后,表名在硬盘上以小写保存,MySQL将所有表名转换为小写存储和查找表上。该行为也适合数据库名和表的别名
也就是说,mysql设置为不分区大小写后,创建库或表时,不管创建时使用大写字母,创建成功后,都是强制以小写保存!

1
2
3
4
5
6
7
8
mysql> show variables  like  "%case%" ;
+ ------------------------+-------+
| Variable_name          | Value |
+ ------------------------+-------+
| lower_case_file_system |  OFF    |
| lower_case_table_names | 1     |
+ ------------------------+-------+
rows  in  set  (0.00 sec)

上面的报错是因为:
开发之前在mysql里创建这张带有大写字母的表时,mysql还是默认的区分大小写设置,即对大小写不敏感。
后来运维同事又将mysql改成不分区大小写设置了,此时mysql都是强制以小写保存的表,所以开发后面再次在程序里引用这张表的时候,就会报错说不存在!

解决办法:
1)先在my.cnf里将lower_case_table_names参数再次调整为0,改成区分大小写
2)然后mysqladmin -uroot -p shutdown 以安全模式关闭数据库
3)登陆mysql数据库,"alter table 旧表名 rename 新表名" 将带大写字母的旧表改为小写表名
4)最后再启动mysql即可!

-------------------------------这里多说一下----------------------------------------------------
MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
1)数据库名与表名是严格区分大小写的;
2)表的别名是严格区分大小写的;
3)列名与列的别名在所有的情况下均是忽略大小写的;
4)变量名也是严格区分大小写的;
5)MySQL在Windows下都不区分大小写,但是在Linux下默认是区分大小写的。
6)如果想在查询时区分字段值的大小写,则字段值需要设置BINARY属性,设置的方法有多种:
     a)创建时设置:
     CREATE TABLE T(A VARCHAR(10) BINARY);
     b)使用alter修改

所以在不同操作系统中为了能使程序和数据库都能正常运行,最好的办法是在设计表的时候都转为小写!!

修改mysql为不区分大小写设置:
[root@test-huanqiu ~]# mysqladmin -uroot -p shutdown //以安全模式关闭数据库
[root@test-huanqiu ~]# cat /etc/my.cnf //添加下面一行设置
.....
[mysqld]
lower_case_table_names=1
.....

[root@test-huanqiu ~]# /etc/init.d/mysql start //启动mysql
-----------------------------------------------------------------------------------------------

***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************
分类:  Mysql
本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/6150748.html ,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
SQL 关系型数据库 MySQL
MySQL中的校对集/大小写敏感/sql_mode实践
MySQL中的校对集/大小写敏感/sql_mode实践
71 0
|
4月前
|
关系型数据库 MySQL 容器
docker-compose安装mysql并指定忽略表名大小写以及挂载配置文件
docker-compose安装mysql并指定忽略表名大小写以及挂载配置文件
123 0
docker-compose安装mysql并指定忽略表名大小写以及挂载配置文件
|
13天前
|
SQL 关系型数据库 MySQL
mysql的大小写对性能的影响问题
mysql的大小写对性能的影响问题
41 0
|
4月前
|
关系型数据库 MySQL 数据库
解决mysql导入新数据库大小写问题(Table 'zup.Domain_System' doesn't exist)
解决mysql导入新数据库大小写问题(Table 'zup.Domain_System' doesn't exist)
36 0
|
4月前
|
SQL 存储 Ubuntu
mysql大小写踩坑
mysql大小写踩坑
41 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL动态表名
MySQL动态表名
|
5月前
|
存储 关系型数据库 MySQL
MySQL定时任务存储过程函数和动态表名实例
MySQL定时任务存储过程函数和动态表名实例
|
5月前
|
关系型数据库 MySQL Linux
linux下mysql 8.0配置大小写不敏感
linux下mysql 8.0配置大小写不敏感
|
10月前
|
关系型数据库 MySQL
Mysql字符串转换大小写
Mysql字符串转换大小写
38 0
|
10月前
|
关系型数据库 MySQL Unix
关于mysql 数据库表名区分大小写导致程序错误解决方法
今天在调试一个开源框架的时候,程序可以正常运行,数据也可以正常加载,但当打开个别功能列表的时候,后台报错(com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jeewms.T_S_student' doesn't exist)找不到mysql的表,然后在数据库查看表的确是存在的啊,并且对比表名都是一样的,忽然想到之前的一个项目也遇到过这个问题。 参数缺省地在 Windows 中这个选项为 1 ,在 Unix 中为 0,所以问题出在linux上。经过配置修改重启后就ok了。希望对遇到这个问题的伙伴们有所帮助。
120 0