EC-CUBE4でMySQL利用時に絵文字を利用する方法

EC-CUBE4をMySQLで利用している場合、標準のままだと絵文字をDBへ登録しようとするとシステムエラーが発生します。 それを防ぐためには文字コードを「utf8mb4」へ変更する必要があります。 前提条件としてMySQL5.7以上を対象としていますが、 MySQL5.6以下でも設定を変更する事で利用可能となります。

パッケージを解凍後EC-CUBEをインストールする前に、 最低限以下の設定をすることで絵文字が登録できるようになります。

  • app/config/eccube/packages/doctrine.yaml
parameters:
    # Adds a fallback DATABASE_URL if the env var is not set.
    # This allows you to run cache:warmup even if your
    # environment variables are not available yet.
    # You should not need to change this value.
    env(DATABASE_URL): ''
    env(DATABASE_SERVER_VERSION): ~
doctrine:
    dbal:
        driver: 'pdo_sqlite'
        server_version: "%env(DATABASE_SERVER_VERSION)%"
        charset: utf8mb4

        # for mysql only
        default_table_options:
          collate: 'utf8mb4_general_ci'

        # With Symfony 3.3, remove the `resolve:` prefix
        url: '%env(DATABASE_URL)%'

        # types
        types:
            datetime: 'Eccube\Doctrine\DBAL\Types\UTCDateTimeType'
            datetimetz: 'Eccube\Doctrine\DBAL\Types\UTCDateTimeTzType'
    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        dql:
            string_functions:
                NORMALIZE: Eccube\Doctrine\ORM\Query\Normalize
            numeric_functions:
                EXTRACT: Eccube\Doctrine\ORM\Query\Extract
        filters:
            option_nostock_hidden:
                class: Eccube\Doctrine\Filter\NoStockHiddenFilter
                enabled: false
            incomplete_order_status_hidden:
                class: Eccube\Doctrine\Filter\OrderStatusFilter
                enabled: false

変更点は12行目と16行目にある
「utf8」「utf8_general_ci」を
「utf8mb4」「utf8mb4_general_ci」
に変更します。

  • src/Eccube/Controller/Install/InstallController.php
if (strpos($params['url'], 'mysql') !== false) {
    $params['charset'] = 'utf8mb4';
    $params['defaultTableOptions'] = [
        'collate' => 'utf8mb4_general_ci',
    ];
}

変更点は564行目と566行目にある
「utf8」「utf8_general_ci」を
「utf8mb4」「utf8mb4_general_ci」
に変更することで絵文字対応が可能となります。 前提として、MySQLから

show variables like "chara%";

を実行時に、 character_set_databaseutf8mb4 になっている必要があります。 そのため、データベースを作成時は必ず utf8mb4 で作成するようにしましょう。

create database [データベース名] default character set utf8mb4;

最後は必ず「utf8mb4」を指定してください。

もう一点環境によってはDBの型を変更する必要があります。

  • src/Eccube/Controller/Entity/Product.php

ここで4000として定義されている、 note description_list description_detai search_word

@ORM\Column(name="note", type="text", nullable=true)

というようにtext型へ変更させる必要があります。

PostgreSQLの方は試してないのですが、特に変更することなく対応できるのではないかと思います。