zoukankan      html  css  js  c++  java
  • MySQL表名大小写敏感导致的问题

     

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

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

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

    变量lower_case_table_names

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

    show variables like '%lower_case_table_names%';
    • 1

    结果: 
    这里写图片描述 
    值为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

    文章标签: mysql数据库
  • 相关阅读:
    tensorflow 2.0 学习 (十) 拟合与过拟合问题
    tensorflow 2.0 学习 (九) tensorboard可视化功能认识
    tensorflow 2.0 学习 (八) keras模块的认识
    tensorflow 2.0 学习 (七) 反向传播代码逐步实现
    tensorflow 2.0 学习 (六) Himmelblua函数求极值
    tensorflow 2.0 学习 (五)MPG全连接网络训练与测试
    arp协议简单介绍
    Pthread spinlock自旋锁
    线程和进程状态
    内核态(内核空间)和用户态(用户空间)的区别和联系·
  • 原文地址:https://www.cnblogs.com/micro-chen/p/9165170.html
Copyright © 2011-2022 走看看