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



我正在使用带有Doctrine的Symfony2来生成我的MySQL表。通常,Doctrine能够非常轻松地更新数据库。

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

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

将索引idx_2d91b64f56629d6d放在表1上;在表 1 上创建索引IDX_13241BA356629D6D (col1_id(;将索引idx_2d91b64fbad26311放在表1上;在表 1 上创建索引IDX_13241BA3BAD26311 (col2_id(;将索引idx_bc100bf27dc308放在表2上;在表2上创建索引IDX_8C245317DC308(col3_id(;省略了一些更相似的行

为什么会这样?我看了一下Symfony如何生成约束名称,它正在使用dechexcrc32,两者都应该是独立于平台的。

这可能不是原因,但它看起来确实是一个可能的原因:

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将根据十进制值生成一个十六进制值,负数或可能。

最新更新