python・datasetライブラリでmysqlのエラー「1366, Incorrect string value」が出たら!

この記事でわかること

・mysqlのエラー「1366, ‘Incorrect string value」の対処方法がわかる

・mysqlに顔文字をinsertする方法がわかる

・なぜ絵文字をutf-8でmysqlに保存しようとすると、エラーが出るのかわかる

 

メイドさん

mysqlに絵文字をinsert文で保存しようとすると、「1366, ‘Incorrect string value」エラーに遭遇する人が多いようです。
この記事では、pythonとdatasetライブラリ(DBのORMライブラリ)を使用してmysqlにデータを保存する例で解説します。

 

発生した問題

pythonとdatasetライブラリ(DBのORMライブラリ)を使用して、mysqlに絵文字を保存しようとしました。その結果、「1366, ‘Incorrect string value」エラーに遭遇しました。

 

原因

mysqlの文字コードの設定が「utf-8」。絵文字を保存するには、4バイト必要だが、utf8は3バイトまでしか対応していないため、保存できない。

その結果、「1366, ‘Incorrect string value」エラーが出力されていた。

 

解消方法

mysqlのテーブルの文字コードをutf8mb4にすること

絵文字を保存するには、4バイト必要です。そのため、

mysqlのテーブルの文字コードをutf8mb4に変更します。

 

文字コードの例:

「あ」→「%E3%81%82」

「😊」→「%F0%9F%98%8A」

 

上記の内容からも絵文字は、4バイトで保存されていることがわかります。

 

参考サイト

Unicode文字ツール

 

文字コード変更例

■すでに存在するテーブルの場合

alter table 「テーブル名」 default character set utf8mb4;

 

■テーブルを新規に作成する場合

CREATE TABLE `テーブル名` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `building_id` int(2) DEFAULT NULL,
  `meter` int(4) DEFAULT NULL,
  `timestamp` datetime DEFAULT NULL,
  `meter_reading` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `building_id` (`building_id`),
  KEY `meter_reading` (`meter_reading`),
  KEY `timestamp` (`timestamp`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

DB接続ドライバーの文字コードの設定をutf8mb4にすること

mysqlの文字コードを変更したら、pythonなどで使用しているmysql接続ドライバーの文字コードの設定も変更します。

以下は、datasetライブラリのmysqlに接続する部分です。

#DBには絵文字もつかうことがあるため文字コードはutf8mb4にする
self.db = dataset.connect(
    'mysql://%s:%s@%s/%s?charset=utf8mb4' % (user_id, password, host, db_name))

 

まとめ

以上の方法で、無事に絵文字をmysqlに保存できるようになりました。

めでたしめでたし・・・。

\IT未経験者からのサポートあり!転職サービス3選!!/

サービス名
未経験 未経験OK 未経験の転職専用 経験者向け
公開の求人数 ITエンジニア全体で1万件以上
ITエンジニア未経験で600件以上
未公開 5,000件以上
利用対象 全職種 IT特化 IT特化
特徴 ✓誰もが知る転職サービス
✓経歴を登録しておくとオファーが来る
✓企業担当者と条件交渉
✓スキルの身につく企業を紹介
✓IT専門のエージェントが対応
✓転職成功すると年収200万円以上の大幅アップがある
転職サポート内容
  • 求人検索
  • 企業担当者と交渉
  • 求人紹介
  • ライフプランのサポート
  • キャリア相談
  • 求人紹介
  • 提出書類の添削
  • 面接対策
公式サイト リクナビネクスト テックゲート レバテックキャリア
最新情報をチェックしよう!