Doctrine orm 条令/MySQL媒体文本+;不必要的ALTER表

Doctrine orm 条令/MySQL媒体文本+;不必要的ALTER表,doctrine-orm,doctrine,dbal,Doctrine Orm,Doctrine,Dbal,在mysql 5.7+2.7/DBAL 2.9上运行,具有: /** * @ORM\Entity() */ class Entity { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string", length=100000, nullabl

在mysql 5.7+2.7/DBAL 2.9上运行,具有:

/**
 * @ORM\Entity()
 */
class Entity {
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=100000, nullable=true)
     */
    private $bigText;
}
orm:schema工具:创建创建表实体:

CREATE TABLE `Entity` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bigText` mediumtext COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
但是,模式工具会考虑需要更新的表,运行
orm:schema-tool:update--dump-sql

ALTER TABLE Entity CHANGE bigText bigText MEDIUMTEXT DEFAULT NULL;
执行更新工作正常,但没有帮助:它仍然认为表需要更新

我已经跟踪到了Doctrine\DBAL\Schema\Comparator的diffColumn方法,其中比较了当前和待列定义的平台选项。“未来”列没有平台选项(这是有意义的,因为我认为它还没有在平台上),而当前列确实有它们,即字符集和排序规则,在我的测试用例中,默认值是:
['charset'=>'utf8','collation'=>'utf8\u unicode\u ci']
,通过
原则\DBAL\Schema\MySqlSchemaManager->\u getPortableTableColumnDefinition()
在列对象上设置

翻一翻源代码,我发现我可以使用EventListeners:因为
Doctrine\DBAL\Schema\AbstractSchemaManager->\u getPortableTableColumnList()
将发出一个
onSchemaColumnDefinition
事件,如果我设置
$event->preventDefault()
在那里创建我自己的Column对象并使用
$event->setColumn($Column)
,我可以绕过
MySqlSchemaManager->\u getPortableTableColumnDefinition()
。或者,我可以去摆弄另一面,更改从类/注释创建的模式,并使用
postGenerateSchemaTable
(这比处理
onSchemaColumnDefinition
)简单得多,感觉也不那么奇怪)。 虽然我对内部流有了更多的了解,但在MySQL中处理mediumtext时,如果不始终创建不必要的ALTER表,这感觉太复杂了

当然,我可以通过使用type=“text”而不是type=“string”+一个固定长度来完全回避这个问题(在提出这个问题之前,我在浏览这里的问题时意识到了这一点),但出于好奇:我是否缺少处理MySQL中属于中等文本长度的固定长度字段的一些基本方法