我正在使用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,它正在使用dechex
和crc32
,两者都应该与平台无关。
答案 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
将根据小数值生成十六进制值,为负数或可能。