【转】MySQL表名大小写敏感导致的问题

MySQL表名大小写敏感问题
本文通过一个实际案例解析了MySQL中表名大小写敏感的问题,并详细介绍了如何检查及修改MySQL系统变量lower_case_table_names的值来解决该问题。

原文地址:https://blog.youkuaiyun.com/postnull/article/details/72455768

 

最近在项目中遇到一个比较奇怪的小问题。在开发过程中自己测试没有问题,但是提测后,测试的同时在测试一个功能时报错了,日志是:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'testdb.Emp' doesn't exist

于是乎打开数据库客户端,发现testdb数据库有这张表,真是奇怪。项目本地测试还是没问题,纠结了半天,才留意到代码中表名是Emp,而数据库中是emp。原来是表名大小写敏感问题。之前一直没有在意这个问题。 

变量lower_case_table_names

为什么本地开发没问题,但是测试环境就提示表不存在呢?因为本地的windows开发环境,默认是大小写不敏感。而测试环境的linux是敏感的。 
本地windows我们执行命令,查看自己电脑中的mysql系统变量可以看到:

show variables like '%lower_case_table_names%';

结果: 
这里写图片描述 
值为1,表示是大小写不敏感,而linux环境的mysql是0. 

修改变量lower-case-table-names

为什么会出现这个问题,主要是因为开发和测试环境不一致导致的,这也是有时测试环境完全没问题,一到生产就出诡异问题的原因之一。所以,我们除了让测试同事认真测试外,最好本地和测试环境还是一致。 
对当前这个问题,我们直接修改SQL中的Empemp即可解决问题,但是为了根本解决问题,我们还须修改mysql的环境变量,也就是将lower_case_table_names的值改为0. 
修改方法: 
1. 找到mysql的安装位置 
2. 找到主目录下的my.ini配置文件 
3. 在[mysqld]节点下添加lower-case-table-names=0 
4. 重启mysql服务 

在配置的时候,很可能遇到这些问题: 
Q:my.ini在哪? 
A:一般在安装路径下。之前我一直修改目录下的my.ini,重启还是无效。上网求助后,发现没有使用这个配置,而是在任务管理、服务中右键属性,看到可执行文件中指定的文件: 
这里写图片描述 
Q:为什么修改了属性后,服务启动不了了。 
A:在一台电脑中MySQL成功启动,但是另一台一直启动不了。初步确定是操作系统的原因,一台是win7启动不了。另一台win10能够修改后启动并生效。最终win7那台设置了2才启动成功。 
原因:

https://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html 
Use lower_case_table_names=0 on Unix and lower_case_table_names=2 on Windows 

为什么windows不能取0?

官方文档给出了答案,说白了就是操作系统是不支持大小写敏感的文件系统。

You should not set lower_case_table_names to 0 if you are running MySQL on a system where the data directory resides on a case-insensitive file system (such as on Windows or OS X).

我们可以测试一下,在D盘建一个文件,命名为test.txt,再建一个文件夹叫Test.txt。我们会得到一串提示,操作系统把test和Test当做相同的字符串了: 
这里写图片描述

在下面将取值范围时,我们会看到0和2的区别。

 

变量lower-case-table-names的取值

取值范围有三个,分别是0、1、2. 
1. 设置成0:表名按你写的SQL大小写存储,大写就大写小写就小写,比较时大小写敏感。 
2. 设置成1:表名转小写后存储到硬盘,比较时大小写不敏感。 
3. 设置成2:表名按你写的SQL大小写存储,大写就大写小写就小写,比较时统一转小写比较。

这个选项不仅仅适用于表名的大小写敏感,同样适用于数据库名和表别名。

更多的资料,可以参考官方文档系统变量部分:

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_lower_case_table_names

 

转载于:https://www.cnblogs.com/eedc/p/9081798.html

<think>好的,我现在需要解决用户关于MySQL大小写敏感度设置的问题。用户之前已经提过相关问题,现在需要更详细的设置方法。让我先回顾之前的对话和提供的引用内容。用户在上一次对话中提到了修改lower_case_table_names参数,但可能遇到了一些问题,比如数据丢失或配置生效。现在用户明确询问如何控制大小写敏感度,需要详细的步骤和注意事项。根据引用[2]和[4],lower_case_table_names参数是关键,操作系统的默认值同。在Unix上是0,Windows是1,macOS是2。设置这个参数需要修改my.cnf文件并重启MySQL服务。但需要注意,在MySQL8.0中,修改这个参数可能需要重新初始化数据库,尤其是在已经存在数据的情况下,这可能会导致数据丢失,如引用[4]提到的步骤中有删除数据目录的操作。另外,引用[1]和[3]提到,除了系统参数,字符集和排序规则也会影响字段内容的大小写敏感,但数据库主要受lower_case_table_names控制。用户的问题集中在上,所以需要重点讲解这个参数。用户可能遇到的问题包括:如何在丢失数据的情况下修改参数,操作系统的差异,以及MySQL版本的限制(如8.0)。需要分步骤说明设置方法,并强调注意事项,比如备份数据、版本兼容性等。现在需要整理回答的结构:首先说明参数的作用,然后详细步骤,包括停止服务、修改配置文件、初始化数据(如果需要)、重启服务。同时要加入注意事项,如操作系统的默认值、MySQL版本的限制、数据备份的重要性。还需要生成相关问题,可能涉及如何验证设置生效、处理数据迁移、同字符集的影响等。确保引用正确,如引用[2]和[4]关于lower_case_table_names的设置,引用[3]关于字符集和排序规则。最后,检查是否需要数学公式,但此问题可能需要,除非涉及性能分析,但用户的问题主要是配置方法,所以可能需要。过之前的回答中有数学公式的例子,但用户这次的问题可能适用,所以可以忽略,除非必要。 总结回答要点:1.参数lower_case_table_names的作用和取值。 2.设置步骤:停止服务、修改配置文件、初始化数据(视情况)、重启。3.注意事项:操作系统差异、MySQL版本限制、数据备份。 4.验证方法:SHOW VARIABLES命令。5.相关问题生成,如丢失数据修改参数、同模式的影响等。 需要确保回答清晰,步骤正确,并引用相关文献,如引用[2][4]说明参数设置,引用[1]说明大小写规则,引用[3]关于字符集的影响。同时,避免之前提到的错误,如MySQL8.0的限制,需要提醒用户注意。</think>### MySQL大小写敏感度设置方法 --- #### **核心参数:`lower_case_table_names`** 该参数控制数据库在存储及查询时的敏感度规则[^2][^4],取值范围如下: - **0**:区分大小写(Unix系统默认值) - **1**:区分大小写(Windows系统默认值) - **2**:按文件大小写存储,但查询时换为小写(macOS默认值) --- #### **配置步骤** 1. **停止MySQL服务**: ```bash sudo systemctl stop mysql # Linux系统 net stop mysql # Windows系统 ``` 2. **修改配置文件**: 打开MySQL配置文件(路径参考): - Linux: `/etc/mysql/my.cnf` - Windows: `C:\ProgramData\MySQL\MySQL Server X.X\my.ini` 在`[mysqld]`段添加参数: ```ini [mysqld] lower_case_table_names=1 # 设为1区分大小写[^4] ``` 3. **处理数据目录(仅首次配置或需要重初始化时)**: ```bash sudo rm -rf /var/lib/mysql/* # 删除旧数据(操作前必须备份!) sudo mysqld --initialize --user=mysql # 重新初始化[^4] ``` 4. **重启服务并验证**: ```bash sudo systemctl start mysql # Linux mysql -u root -p SHOW VARIABLES LIKE 'lower_case%'; # 应显示值为1[^2] ``` --- #### **注意事项** 1. **操作系统差异**: - Unix系统默认区分大小写(值为0),Windows默认区分(值为1)[^2] - 跨平台迁移时需统一配置 2. **MySQL版本限制**: - **MySQL 8.0及以上**要求初始化时设置`lower_case_table_names`,已有数据的实例修改需重初始化[^4] 3. **字符集影响**: - 字段内容的大小写敏感度由字符集排序规则决定(如`utf8_general_ci`区分,`utf8_bin`区分)[^3] --- #### **验证配置生效** ```sql -- 创建测试 CREATE TABLE TestCase (id INT); -- 尝试查询(应返回相同结果) SELECT * FROM testcase; SELECT * FROM TESTCASE; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值