今天在将开发环境中的门户数据库复制到新环境后,使用SqlSugar的ORM框架进行数据库操作的时候,出现了主键找不到的现象。排查了很久终于发现了关键点。特此记录。

1.开发环境:
    操作系统:CENTOS7 64位
    内存:    1GB
    CPU     1/1
    网络适配器:网桥模式
    安装模式:最小化安装
    系统语言设置:zh_CN.gb2312
    
    数据库版本:MySQL 5.6.29 binary 模式安装
    建立数据库之前:my.cnf参数配置
        character-set-server = utf8
        log-bin=mysql-bin
        skip-name-resolve
        lower_case_table_names = 0  #之后可能设置过1的现象
    开发数据库实例名称:GoodMES_P_V0_5
    数据库实例中表名称,列名称 全部大写
    具体还经过哪些设置暂时不记得了,但是最终的结果是,不论sql语句中表名称大小写,都能查到数据。根据推测,数据库大小写也都能认识。对数据库的操作是DOS.ORM
    
2.这次的部署环境:
    操作系统:CENTOS7 64位
    内存:    1GB
    CPU     1/1
    网络适配器:网桥模式
    安装模式:最小化安装
    系统语言设置:zh_CN.UTF-8
    
    数据库版本:MySQL 5.6.29 binary 模式安装
    数据库实例名称:G_START
    数据库实例中表名称,列名称 全部大写
    
    使用SqlSugar的ORM框架进行数据库操作的时候,出现了主键找不到的现象。通过记录mysql日志信息,得到数据库操作记录信息,发现SqlSugar的ORM框架对数据库的操作之前,必然都会将实体名称,表名称,列名称全部转换成大小写。然而由于mysql默认设置的是大小写敏感,故而找不到主键信息。同时针对需要主键信息来进行处理的内容,都会存在问题,因为SQLSugar的InSingle操作或者其他的针对主键的操作,都会进行一个获取主键的动作,而这个获取主键的动作是通过
    select DISTINCT TABLE_NAME as tableName,COLUMN_NAME as keyName from INFORMATION_SCHEMA.COLUMNS where table_name='" + tableName + "' AND COLUMN_KEY='PRI'这个SQL语句来获取的,虽然这里的tableName传入是正确的是表名称,但是由于是被转换成了小写,所以这里是查不到数据的。从而导致了找不到主键的情况(SQLSugar框架的坑还是大部分数据库操作框架的坑?)。
    查阅网上信息,说可以通过设置lower_case_table_names这个数据库的参数来进行设置,设置了lower_case_table_names=1(大小写不敏感)一个更严重的问题出现了,因为数据库实例的名称也是大写的。但是SQLsugar同样的进行了小写化操作。所以数据库仍然是找不到的,同样的mysql客户端在选择该数据库的时候,也出现了数据库未找到的情况。
    查询mysql官网,lower_case_table_names有第三个参数:
    0:默认值,大小写敏感;请注意如果在大小写不敏感的文件系统上用--lower-case-table-names=0强制设为0,并且使用不同的大小写访问MyISAM表名,会导致索引破坏。
    1:表名在硬盘上以小写保存,名称对大小写不敏感。MySQL将所有表名转换为小写以便存储和查找
    2:表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写进行保存,但MySQL将它们转换为小写以便查找。(这个操作需谨慎,因为一旦这样设置了,那么实际上就变成了表里不一的情况,查找问题就比较难了。)
    很明显我的目的是否能实现的最终拍板权还是文件系统,无论我怎么设置大小写敏感还是大小写不敏感,都无法对数据库进行操作。区别点在于一个是能连接到数据库,一个是连数据库都找不到了。
    所以我的最终结果是:
    1.设置数据库大小写不敏感
    2.重新配置一个实例:实例名称小写
    3.将开发环境中的数据表导出一份
    4.将表结构导入到部署环境,你会发现导入后的表名都变成了小写。但是表中的列的名称仍然是大写。
    
    结论:在windows下MySQL数据库中实例,表,列的名称都是大小写不区分的,随意折腾。但是到了类Unix系统,比如Ubuntu,CentOS,那么在部署数据库之前必须要谨慎考虑,是需要大小写敏感还是大小写不敏感。数据库中实例,表,列名称的命名是要用大写的还是小写的。万一处理不好,最糟糕的可能就是数据库重建。耗时耗力,还吃力不讨好。
    
    建议:命名全部小写;建议区分大小写。一旦设定,则不建议修改数据库设置。同时在应用时选择数据库操作框架的时候,需要谨慎考虑。了解底层对数据库的操作方式。

Linux下部署MySQL,大小写敏感踩坑记录的更多相关文章

  1. Linux下安装opencv(踩坑记录帖)

    1.首先安装依赖项:sudo apt install build-essential sudo apt install build-essentialsudo apt install cmake gi ...

  2. Centos7下搭建gitbook环境踩坑记录

    1.安装npm yum -y install npm 2.配置npm仓 npm config set registry https://mirrors.tencent.com/npm/ 3.安装git ...

  3. Win10自带Ubuntu子系统下Mysql安装踩坑记录

    linux系统为win10自带Ubuntu子系统 错误的安装过程 我按照一般的方法安装mysql,安装步骤如下 1.升级源 $ sudo apt-get update 2.安装mysql $ sudo ...

  4. 在Linux下部署mysql时,使用group by碰到的问题

    mysql使用group by 的时候报错,错误信息如下: 1055:ER_WRONG_FIELD_WITH_GROUP: Expression #2 of SELECT list is not in ...

  5. dell笔记本 win10 下安装 ubuntu16.04 踩坑记录

    硬件配置情况: dell笔记本-灵越-5577 —— I5七代(带有集显),8G内存条DDR4,GTX1050,128G固态硬盘,1T机械硬盘. 固态硬盘划分为3部分,100GB给win10的C盘,1 ...

  6. 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负责的模块connector就派上了用场. ...

  7. CentOS7.4安装MySQL踩坑记录

    CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...

  8. ubuntu 下安装docker 踩坑记录

    ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...

  9. linux下部署php项目-Apache、php、mysql关联

    linux下部署php项目环境可以分为两种,一种使用Apache,php,mysql的压缩包安装,一种用yum命令进行安装. 使用三种软件的压缩包进行安装,需要手动配置三者之间的关系.apache和p ...

随机推荐

  1. ACN经典例题1

    1.韩信点兵 描述相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入3个非负整数a,b,c ,表示每种 ...

  2. lazyload.js参数说明

    lazyload.js是jQuery的一个插件,可以用来实现图片异步加载. lazyload插件如何添加参数: $("img").lazyload({ //参数添加到此位置,建议一 ...

  3. LeetCode:盛最多水的容器【11】

    LeetCode:盛最多水的容器[11] 题目描述 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为  ...

  4. MySQL 及 SQL 注入与防范方法

    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的, ...

  5. castle windsor学习-----Registering components one-by-one 注册类型

    1.在容器中注册一个类型 container.Register( Component.For<IMyService>() .ImplementedBy<MyServiceImpl&g ...

  6. Shiro身份认证-JdbcRealm

    Subject 认证主体 Subject认证主体包含两个信息 Principals : 身份,可以是用户名.邮箱.手机号等,用来标识一个登录主体身份. Credentials : 凭证,常见有密码,数 ...

  7. java 多线程踩过的坑

    多线程踩坑记录:1.多线程切记不可以同时操作同一个原子数据.解释:存在一个条数据库A数据,不可以在2个或2个以上的线程中同时操作A数据.会引发重复操作.2.多线程操作方法不要加synchronized ...

  8. STL list链表的用法详解

    本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通函数,而且例子丰富,通俗易懂.不失为STL的入门文章,新手不容错过! 0 前言 1 定义一个list 2 使用list的成员函 ...

  9. Spring Boot -- actuator

    Spring Boot有四大神器,分别是auto-configuration.starters.cli.actuator,本文主要讲actuator.actuator是spring boot提供的对应 ...

  10. L103

    Give everyday the chance to become the most beautiful day of your life.把每天都过成你生命中最美好的一天.competence 能 ...