为什么Doctrine生成不同的约束名称?

时间:2014-12-16 14:01:37

标签: php mysql symfony doctrine-orm

我正在使用Symfony2和Doctrine来生成我的MySQL表。通常,Doctrine能够非常容易地更新数据库。

MySQL服务器在linux机器上。还有一个运行Apache的Symfony应用程序。在Linux机器上运行php app/console doctrine:schema:update --dump-sql时,Doctrine告诉我我的数据库是最新的。

但是,当在Windows上在完全相同的Symfony应用程序上运行此命令并连接到Windows机器上的MySQL服务器时,Doctrine想要更改相当多的约束名称。它似乎想要重命名所有索引:

DROP INDEX idx_2d91b64f56629d6d ON table1;
CREATE INDEX IDX_13241BA356629D6D ON table1 (col1_id);
DROP INDEX idx_2d91b64fbad26311 ON table1;
CREATE INDEX IDX_13241BA3BAD26311 ON table1 (col2_id);
DROP INDEX idx_bc100bf27dc308 ON table2;
CREATE INDEX IDX_8C245317DC308 ON table2 (col3_id);
// some more similar lines omitted

为什么会这样?我查看了how Symfony generates the constraint names,它正在使用dechexcrc32,两者都应该与平台无关。

1 个答案:

答案 0 :(得分:0)

这可能不是原因,但看起来确实可能是原因:

http://php.net/manual/en/function.crc32.php

在红色部分中,它指出crc32可以返回负值或正值,具体取决于32或64位系统。

这是因为32个有符号整数的范围:−2,147,483,648 to 2,147,483,647。 如果您认为crc32假设使用无符号字节,则它在2,147,483,647上生成的任何值都将变为负值。

然后dechex将根据小数值生成十六进制值,为负数或可能。