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

简介:

问题描述:
一开发同事在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             |
+ -------------------------------------------+
8  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     |
+ ------------------------+-------+
2  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     |
+ ------------------------+-------+
2  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 ,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 关系型数据库 MySQL
MySQL细节优化:关闭大小写敏感功能的方法。
通过这种方法,你就可以成功关闭 MySQL 的大小写敏感功能,让你的数据库操作更加便捷。
1405 19
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库如何设置忽略表名大小写?
【10月更文挑战第1天】使用Docker部署的MySQL数据库如何设置忽略表名大小写?
2342 1
|
关系型数据库 MySQL 数据库
docker mysql表名和数据库名不区分大小写
docker mysql表名和数据库名不区分大小写
237 0
|
关系型数据库 MySQL Unix
MySQL配置不区分大小写的方法
结论 通过适当配置 lower_case_table_names参数以及在数据定义和查询中选择合适的校对规则,可以灵活地控制MySQL中的大小写敏感性,以适应不同的应用场景和需求。这样的设置既可以增加数据库的兼容性,又可以在必要时利用大小写敏感性进行精确的数据处理。需要注意的是,修改 lower_case_table_names参数后,最好在数据库初始化时进行,以避免现有表名的大小写问题。
1884 3
|
存储 关系型数据库 MySQL
"Linux环境下MySQL数据库名及表名大小写敏感性设置详解:从配置到影响,确保数据库操作的准确与高效"
【8月更文挑战第9天】在Linux环境中,MySQL数据库名及表名的大小写敏感性是一项重要配置。默认情况下,MySQL在Linux上区分大小写,但这可通过配置文件 `/etc/my.cnf` 中的 `lower_case_table_names` 参数调整。该参数设为0时,名称存储时保持原样,查询时不区分大小写;设为1则全部转换为小写。通过编辑配置文件并重启MySQL服务,可根据需求灵活控制名称的大小写敏感性,确保数据一致性和应用兼容性。
1537 3
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之要将MySQL同步到Doris,并设置整库同步,只变更库名、表名和表结构都不变,该如何设置
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
SQL 关系型数据库 MySQL
【Mysql】在多表查询过程中如果已经起了别名,就不能通过表名限定字段
【Mysql】在多表查询过程中如果已经起了别名,就不能通过表名限定字段
|
Ubuntu 关系型数据库 MySQL
Ubuntu 20.04 + mysql8 安装以及配置大小写不敏感
Ubuntu 20.04 + mysql8 安装以及配置大小写不敏感
1300 1
|
SQL 关系型数据库 MySQL
MySQL 迁移至 SQLite 问题记录
将WPF项目从MySQL迁移到SQLite以简化部署流程。涉及更换Nuget包(Microsoft.Data.Sqlite.Core或System.Data.SQLite),修改SQL语法,如主键和唯一约束的声明,以及处理数据库连接和数据类型差异。SQLite不支持MySQL的truncate语句,需用delete并清理sqlite_sequence表。还需注意逻辑操作符&&需替换为and。更多细节在文中详述。
776 0
|
存储 关系型数据库 MySQL
docker安装mysql8忽略大小写
docker安装mysql8忽略大小写
2730 0

推荐镜像

更多