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_database が utf8mb4 になっている必要があります。
そのため、データベースを作成時は必ず 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の方は試してないのですが、特に変更することなく対応できるのではないかと思います。