我们所有的MySQL约束都变成了小写。是什么导致这个?

时间:2012-09-15 11:44:21

标签: mysql foreign-keys constraints case-sensitive camelcasing

我们对所做的一切都有一个camelCase命名约定 - 从数据库表到对象属性,列,数据库索引和约束。

我们一直在使用这些约定两个月的新项目,一切都很顺利,昨晚突然间我们6个数据库中只有一个的所有关系从camelCase转换为小写。重要的是要注意只有转换的约束 - 索引本身保留了camelCase。

因此,如果我们有一个名为someColumn的列和另一个名为someTable.otherColumn的列,那么它就是这样的:

someColumn => someTable.otherColumn ON DELETE CASCADE ON UPDATE CASCADE

到此:

someColumn => sometable.otherColumn ON DELETE CASCADE ON UPDATE CASCADE

是什么导致这个?我们无法重现这个问题 - 我们尝试更改随机约束以查看它是否会全部更改它们并且我们尝试重新导入结构并且它很好,保持camelCase不被导入。

我们致力于OSX并部署到CentOS。

编辑:一位开发人员使用不区分大小写的OSX。他尝试从他自己的机器上的导出重新导入数据库,它仍然很好,因此:从不区分大小写的机器导入转储到区分大小写的CentOS 中断了。重启mysqld也无法重现这个bug。所有强制小写的mysql设置都关闭。到目前为止,我们再也无法实现它。

Edit2:请注意,这只发生在我们的CentOS开发服务器上 - 使用不区分大小写操作系统的开发人员之前已经从区分大小写的系统中导入了他的数据库,而且每次都很好。

2 个答案:

答案 0 :(得分:6)

Bug report #55897表明这是按设计进行的,并记录在Limits on InnoDB Tables下:

  

在Windows上,InnoDB始终在内部以小写形式存储数据库和表名。

另见Case insensitive constraint names in MySQL

答案 1 :(得分:4)

你需要在OSX服务器的my.cnf上检查MySQL中的两个变量

根据lower_case_table_names

上的MySQL文档
  

如果在具有不区分大小写的文件名(例如Windows或Mac OS X)的系统上运行MySQL,则不应将此变量设置为0。如果在此类系统上将此变量设置为0并使用不同的字母表访问MyISAM表名,则可能会导致索引损坏。在Windows上,默认值为1.在Mac OS X上,默认值为2.

尽管上面的摘录引用了MyISAM,但只能猜测在OSX中默认值为lower_case_table_names时,InnoDB会跳过MySQL。鉴于此,如果你的OSX的my.cnf中有lower_case_table_names=0lower_case_table_names=1,mysqld可能有点混乱。

因此,如果来自OSX服务器的任何mysqldump移入CentOS并不会改变这种情况,请不要感到惊讶。

这很可能是你现在正在与之斗争的。