Corrige um falso-positivo comum do declarative schema do Magento 2: divergências de charset/collation causadas por aliases, não por diferenças reais no banco.
Em muitas instalações Magento — principalmente depois de migrações de host,
restauração de dumps antigos, ou upgrade de versão do MySQL/MariaDB — o banco
reporta utf8 enquanto a declaração do Magento resolve para utf8mb3 (ou
vice-versa). Para o MySQL isso é o mesmo charset. Para o comparador de schema
do Magento, são duas strings diferentes, e ele marca a tabela como "alterada"
em toda execução.
Sintomas típicos:
bin/magento setup:upgradedemorando muito mais do que deveria, porque o comparador recalcula diffs em centenas de tabelas a cada deploy.bin/magento setup:db:statusnunca retorna "up to date", mesmo sem nenhuma mudança real de schema pendente.
O módulo registra um plugin beforeCreate em
Magento\Framework\Setup\Declaration\Schema\Dto\Factories\Table, a factory
usada tanto para montar o DTO da tabela a partir da declaração (XML) quanto a
partir da introspecção do banco real. Antes do DTO ser criado, ele normaliza
charset/collation para uma forma canônica, usando um mapa de aliases
conhecidos — eliminando o ruído antes que o comparador veja a diferença.
composer require alekhine-dev/module-schema-charset-normalizer
bin/magento module:enable AlekhineDev_SchemaCharsetNormalizer
bin/magento setup:upgradeOs aliases padrão cobrem o caso mais comum (utf8 → utf8mb3). Se seu
ambiente tiver outros aliases legados, adicione-os via di.xml do seu próprio
módulo — não é necessário alterar esta classe:
<type name="AlekhineDev\SchemaCharsetNormalizer\Plugin\NormalizeCharsetCollationPlugin">
<arguments>
<argument name="charsetAliases" xsi:type="array">
<item name="utf8" xsi:type="string">utf8mb3</item>
<item name="latin1" xsi:type="string">latin1</item>
</argument>
</arguments>
</type>Ele não altera nada no banco de dados. Ele só normaliza como o Magento compara charset/collation durante o setup:upgrade/setup:db:status. Outras divergências reais de schema (tipo de coluna, tamanho, unsigned, auto_increment, índices, etc.) continuam sendo detectadas normalmente — e continuam exigindo uma decisão caso a caso sobre corrigir ou não.
MIT — veja LICENSE.