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に保存できるようになりました。

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

評判も見えるPGスクール検索・比較表

どのプログラミングスクールがいいんだろう?
そんな疑問をお持ちの方に、評判も見えるプログラミングスクール検索・一括比較サービスをリリースしました。

条件を指定することにより、気になるプログラミングスクールを一発で比較できます。
きっと、条件にあったスクールが見つかるかと思います!
詳細は、以下の画像をクリック!

プログラミングスクール検索・比較のペン太ブル
スポンサーリンク
PR




PR




シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
PR