You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,否则仍会出现乱码。
  • 操作前务必备份全量数据,避免意外数据丢失。

2. 是否可仅修改相关表的受影响列?

完全可以,这是更轻量化的最优方案,仅针对存储用户姓名的列修改,减少不必要的范围影响:

  • 需要调整的核心表和列:
    • customer_entity:firstname、lastname
    • customer_address_entity:firstname、lastname
    • sales_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:53:25