~ Web系エンジニアのブログです ~

Sequelizeで作成したDBのエンコードをutf8mb4 に変える

Sequelize
MySQL
Node.js

Node.jsのORMであるSequelizeを使用し、DBを作成した際に日本語が登録できない問題に遭遇したので備忘として。

起きたこと

  • Sequelizeを使用してDBを作成する際にデフォルトだとエンコーディングがcp1252 West European (latin1)となってしまう。

  • やったこと

  • Dockerを使い環境を構築していたため、 sequelize-cli はprojectにinstallしていて、 yarn sequelize として呼び出すようにしていた。
  • 今回は yarnsequelize db:create でDBを作成していた。
  • utf8mb4 に変えるため、 config.json を以下のようにし、 db:create を実行していたが、変わらずだった。。。

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    "development": {
      "username": "root",
      "password": "",
      "database": "db_name",
      "host": "db",
      "dialect": "mysql",
      "define": { 
    		"charset": "utf8mb4",
        "collate": "utf8mb4_general_ci"
    	}
     }

    解決策

    まず結論を書くと、以下2つがお手軽に解決できる


  • db:create コマンド実行時に —charset=utf8mb4 を加える(sequelize db:create —charset=utf8mb4) ⇒ createするごとに指定する必要があるためちょっと手間かも。。。
  • migrationsフォルダにcharsetを変更するmigrationファイルを追加する



  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // /migrations/000000-fix-db-charset.js
    
    'use strict';
    
    module.exports = {
      up: (queryInterface, Sequelize) => {
        return queryInterface.sequelize.query(
          `ALTER DATABASE ${
            queryInterface.sequelize.config.database
          } CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;`
        );
      },
    
      down: (queryInterface, Sequelize) => {}
    };


    原因

    sequelize.sync({ force: true }) を実行する場合は、各テーブルのデフォルトエンコーディングとして設定してくれるらしいく、sequelize-cliではconfig.jsonを認識してくれないようだ。。。