芽萌丸プログラミング部@programming
投稿日 2024/10/7
更新日 2024/10/7 ✏

node-mysqlを使った絵文字挿入でER_TRUNCATED_WRONG_VALUE_FOR_FIELDエラー

前提

問題

CREATE TABLE IF NOT EXISTS `test` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `content` TEXT CHARACTER SET utf8mb4 NOT NULL COMMENT '絵文字入りコンテンツ',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=ASCII;

CLIのmysqlクライアントから上記のテーブルへ絵文字入りのレコードをINSERTすると成功するにもかかわらず、 プログラムから node-mysql モジュールを使ってINSERTするとER_TRUNCATED_WRONG_VALUE_FOR_FIELDエラーが発生する。

問題のコード:

const mysql = require("mysql");

const conn = mysql.createConnection({
  host: '127.0.0.1',
  user: 'dbuser',
  password: 'dbpass',
  database: 'test',
});

// ER_TRUNCATED_WRONG_VALUE_FOR_FIELDエラー!!!
conn.query("INSERT INTO `test`(`content`) VALUES ('😀')", (err, res) => {...});

解決方法

node-mysql モジュールのDB接続作成オプションにcharset: "utf8mb4"を与える。

const conn = mysql.createConnection({
  // ...
  charset: 'utf8mb4', // <= 明示的に指定!
});

// エラー無く絵文字をINSERTできる!
conn.query("INSERT INTO `test`(`content`) VALUES ('😀')", (err, res) => {...});

以上


芽萌丸プログラミング部
芽萌丸プログラミング部@programming
プログラミング関連アカウント。Web標準技術を中心に書いていきます。フロントエンドからサーバサイドまで JavaScript だけで済ませたい人たちの集いです。記事は主に @TanakaSoftwareLab が担当。