我正在使用带有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如何生成约束名称,它正在使用dechex
和crc32
,两者都应该是独立于平台的。
这可能不是原因,但它看起来确实是一个可能的原因:
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
将根据十进制值生成一个十六进制值,负数或可能。