mysql中表大小写敏感规则引发的问题
原文 https://balalals.cn踩坑原因在部署一个工作流项目(flowable)时,该项目用到了自动创建表的一个机制,没看源代码但是大体意思就是检测不到数据库中有表的存在程序就自己创建。windows下没有问题,linux下报一些奇怪的错误。排查描述问题前先描述一下项目的关系因为的确有点乱 ????。flowable 项目是要搭建的项目在gitee上托管,我们暂时称之为f1然后这个项目

踩坑原因
在部署一个工作流项目(flowable)时,该项目用到了自动创建表的一个机制,没看源代码但是大体意思就是检测不到数据库中有表的存在程序就自己创建。windows下没有问题,linux下报一些奇怪的错误。
排查
描述问题前先描述一下项目的关系因为的确有点乱 😭。
flowable 项目是要搭建的项目在gitee上托管,我们暂时称之为f1然后这个项目又是基于github上的一个项目改的,这个项目我们暂时称为f2。
程序自动建表如果完成的很好那当然是大吉大利。自动建表操作是f2来做的,它所建的表都是些核心表,表名为大写。前面说了f1 是在f2 上面扩展的那必然就会有自己的表。只依靠f2自动建表是不行的,项目根本跑不起来。f1提供了initsql,sql中包含了所有的表,有自己的还有f2的那些核心表,表名均为小写。
部署过程先把服务器上的数据库建好然后导入数据,一切正常数据库出现了一堆小写的表。运行f1程序,报错信息是一些表外建重复定义之类的。这时再看数据库出现了很多大写的表名。和小写表名重复的。比如 act_ru_job ACT_RU_JOB。第一次看到有点懵。为什么windwos下没有问题,到linux下就又问题了。把windows下的程序数据库连接换为Linux的一样报错。这下明白肯定是操作系统间不同的机制导致出的幺蛾子。疯狂google了一番找到了相关信息。
在mysql中执行下面语句show variables like '%lower_case_table_names%';
表现的值有三种 0 1 2。
- 0 linux 下默认规则,表名区分大小写。
- 1 windows 下默认规则,表名存储在磁盘是小写的,但是比较的时候是不区分大小写。
- 2 macos,下默认规则,表名存储为给定的大小写但是比较的时候是小写的
这下才明白,程序为啥一直检测不到表存在,然后自己创建。原因就是linux下大小写严格区分的,改为和windwos下的值一样就可以了。事情不会那么简单😂。
限制
找到my.conf在[mysqld] 下添加 lower_case_table_names=1,保存重启。mysql跑不起来,官方文档上写这个参数只能在数据库初始化操作之前添加,如果数据库已经初始化完成了就不能再添加了,那么怎么办呢?
如果没有重要数据直接删除数据目录,执行 mysqld --initialize --user=mysql --lower-case-table-names=1 要加上–user=mysql。不然数据目录所有者是root启动时会报权限错误。
有数据的话先导出设置好后再导入。
总结
因为这个破问题搞了好几个小时,实属恶心。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)