Magento 2 Cloud 2.4.6:MariaDB 10.6 utf8mb3转utf8mb4及Emoji存储问题
Magento 2.4.6 Cloud 支持Emoji字符的解决方案
1. 全表全列从utf8mb3改为utf8mb4是否影响系统功能?
- 核心功能不受影响:Magento 2.4.x官方原生兼容utf8mb4,且推荐使用该字符集以支持完整Unicode字符(包括Emoji)。
- 需注意两个风险点:
- 索引长度限制:InnoDB单索引列最大长度默认767字节(开启
innodb_large_prefix后可扩展至3072字节)。utf8mb4每个字符占4字节,若原表存在varchar(255)列的索引,原utf8mb3下为255*3=765字节(符合限制),改为utf8mb4后变为1020字节,会触发索引创建失败。此时需调整列长度(如改为varchar(191))或确认已开启innodb_large_prefix(MySQL 5.7+默认开启)。 - 连接配置同步:必须将
app/etc/env.php中db/connection/default/charset设为utf8mb4、collation设为utf8mb4_unicode_ci,否则仍会出现乱码。
- 索引长度限制:InnoDB单索引列最大长度默认767字节(开启
- 操作前务必备份全量数据,避免意外数据丢失。
2. 是否可仅修改相关表的受影响列?
完全可以,这是更轻量化的最优方案,仅针对存储用户姓名的列修改,减少不必要的范围影响:
- 需要调整的核心表和列:
customer_entity:firstname、lastnamecustomer_address_entity:firstname、lastnamesales_order_address:firstname、lastname(若订单地址需显示Emoji)
- 只需将这些列的字符集改为
utf8mb4、排序规则设为utf8mb4_unicode_ci,同步数据库连接配置即可解决乱码问题。
3. 如何通过代码而非手动完成修改?
使用Magento官方推荐的Schema补丁实现自动化修改,无需手动执行SQL语句:
步骤1:创建Schema补丁文件
在自定义模块下创建补丁类(路径示例:app/code/YourVendor/YourModule/Patch/Schema/ConvertEmojiSupportedColumns.php):
<?php namespace YourVendor\YourModule\Patch\Schema; use Magento\Framework\Setup\Patch\SchemaPatchInterface; use Magento\Framework\Setup\SchemaSetupInterface; class ConvertEmojiSupportedColumns implements SchemaPatchInterface { /** @var SchemaSetupInterface */ private $schemaSetup; public function __construct(SchemaSetupInterface $schemaSetup) { $this->schemaSetup = $schemaSetup; } public function apply() { $this->schemaSetup->startSetup(); $connection = $this->schemaSetup->getConnection(); // 定义需要修改的表和列映射 $targetColumns = [ 'customer_entity' => ['firstname', 'lastname'], 'customer_address_entity' => ['firstname', 'lastname'], 'sales_order_address' => ['firstname', 'lastname'] ]; foreach ($targetColumns as $table => $columns) { $tableName = $this->schemaSetup->getTable($table); foreach ($columns as $column) { // 修改列的字符集与排序规则 $connection->alterColumn( $tableName, $column, [ 'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 'length' => 255, 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'nullable' => false ] ); } // 可选:设置表默认字符集 $connection->execute("ALTER TABLE {$tableName} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); } $this->schemaSetup->endSetup(); } public static function getDependencies() { return []; } public function getAliases() { return []; } }
步骤2:同步数据库连接配置
修改app/etc/env.php中的数据库连接参数,确保字符集配置正确:
'db' => [ 'table_prefix' => '', 'connection' => [ 'default' => [ 'host' => 'your-db-host', 'dbname' => 'your-db-name', 'username' => 'your-db-user', 'password' => 'your-db-pass', 'model' => 'mysql4', 'engine' => 'innodb', 'initStatements' => 'SET NAMES utf8mb4;', 'active' => '1', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci' ] ] ]
步骤3:执行补丁
- Magento Cloud环境:提交代码后,部署流程会自动执行补丁。
- 本地/测试环境:手动执行以下命令触发补丁运行:
bin/magento setup:upgrade
内容的提问来源于stack exchange,提问作者davis du
相关产品推荐
相关产品推荐

