1.我有一个基于Magento云项目Magento 2.4.6现在我需要保存字符串到客户名,地址名,甚至帐单地址名。如果没有,它会显示吗?当人们从在线或其他渠道登录时,在前端页面。1.那么,如果我将每个列从utf8mb3完全更改为utf8mb4,是否会影响功能?1.是否可以只更改多个表中受影响的列?1.如果对整体功能没有影响,如何通过代码更改而不是手动更改?
e4yzc0pl1#
我和你在订单项目表上遇到了同样的问题,客户可以在这里输入表情符号来定制文本。当时,我手动更改了该表排序规则,并且在每次setup:upgrade时,我都必须再次更改它。大约一年前,我决定更改所有表的字符集和排序规则,现在仍然很好。所以,我认为在Magento正式支持它之前,为你改变它是没有问题的。但我有一个第三方模块的问题。其中一个是在db_schema中定义的字符集,没有必要这样做,所以我从db_schema中删除了它。以下是我的解决方案:首先,您需要一个自定义模块。在自定义模块的di文件(位于app/code/Vendor/Module/etc/di.xml中)中,添加以下覆盖:
db_schema
app/code/Vendor/Module/etc/di.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <!-- ... --> <preference for="Magento\Framework\DB\Ddl\Table" type="Vendor\Module\Core"/> <type name="Magento\Framework\Setup\Declaration\Schema\Dto\Factories\Table"> <plugin name="override_default_charset" type="Vendor\Module\Plugin\OverrideDefaultCharsetPlugin" sortOrder="1" disabled="false"/> </type> </config>
在模块根目录下创建Core.php文件(app/code/Vendor/Module/Core):
Core.php
app/code/Vendor/Module/Core
<?php namespace Vendor\Module; use Magento\Framework\DB\Ddl\Table; class Core extends Table { protected $_options = ['type' => 'INNODB', 'charset' => 'utf8mb4', 'collate' => 'utf8mb4_unicode_ci']; }
您可以更改collate或发动机类型。然后,您需要创建一个插件来覆盖默认字符集。在app/code/Vendor/Module/Plugin中创建OverrideDefaultCharsetPlugin.php:
collate
app/code/Vendor/Module/Plugin
OverrideDefaultCharsetPlugin.php
<?php declare(strict_types=1); namespace Vendor\Module\Plugin; use Magento\Framework\Setup\Declaration\Schema\Dto\Factories\Table; class OverrideDefaultCharsetPlugin { private const DEFAULT_CHARSET = 'utf8mb4'; // You can change the default Collation as you need. private const DEFAULT_COLLATION = 'utf8mb4_unicode_ci'; /** * @param Table $subject * @param array $data * @return array */ public function beforeCreate(Table $subject, array $data): array { if (!isset($data['charset'])) { $data['charset'] = self::DEFAULT_CHARSET; } if (!isset($data['collation'])) { $data['collation'] = self::DEFAULT_COLLATION; } return [$data]; } }
最后运行bin/magento setup:upgrade和bin/magento setup:di:compile。
bin/magento setup:upgrade
bin/magento setup:di:compile
1条答案
按热度按时间e4yzc0pl1#
我和你在订单项目表上遇到了同样的问题,客户可以在这里输入表情符号来定制文本。当时,我手动更改了该表排序规则,并且在每次setup:upgrade时,我都必须再次更改它。大约一年前,我决定更改所有表的字符集和排序规则,现在仍然很好。所以,我认为在Magento正式支持它之前,为你改变它是没有问题的。
但我有一个第三方模块的问题。其中一个是在
db_schema
中定义的字符集,没有必要这样做,所以我从db_schema
中删除了它。以下是我的解决方案:
首先,您需要一个自定义模块。
在自定义模块的di文件(位于
app/code/Vendor/Module/etc/di.xml
中)中,添加以下覆盖:在模块根目录下创建
Core.php
文件(app/code/Vendor/Module/Core
):您可以更改
collate
或发动机类型。然后,您需要创建一个插件来覆盖默认字符集。在
app/code/Vendor/Module/Plugin
中创建OverrideDefaultCharsetPlugin.php
:最后运行
bin/magento setup:upgrade
和bin/magento setup:di:compile
。