Python – MySQL Incorrect string value~のエラー

python 3.X系です

表題の件、ハマりました・・・

このエラー↓
DatabaseError(1366, "1366 (HY000): Incorrect string value: '\\xF0\\x9F\\x91\\x91...' for column ~

ググるとMySQL側の設定の話がたくさん出てきて、だいたい検索して出てきた全ての設定をやったのにまだダメでした~_:(´ཀ`」 ∠):

結論から言うと、Python側でMySQLに接続するときの設定がダメでした!

 

【前段】MySQL側の文字コード設定の話

私はWindows 10でMySQLは5.6です
設定の確認は以下

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

実行すると以下な感じに出てきます

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | cp932              |
| character_set_connection | cp932              |
| character_set_database   | utf8               |
| character_set_filesystem | binary             |
| character_set_results    | cp932              |
| character_set_server     | utf8               |
| character_set_system     | utf8               |
| collation_connection     | cp932_japanese_ci  |
| collation_database       | utf8_general_ci    |
| collation_server         | utf8_general_ci    |
+--------------------------+--------------------+

なんかこのあたりは検索すると色々記事が出てきますんで、省略しますが、ここの設定変更もわりとハマりましたので、そのポイントだけ書いておきます
最終的に↑の設定と、テーブルの設定をutf8mb4にすればよいのですが、my.iniでの変更がなかなか効きませんでした・・

 

my.iniの変更

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4

 

上記に変更して、再起動するも以下のようにcp932の箇所がutf8mb4に変わりません・・・utf8のところはutf8mb4にはなってくれたのに(>_<)

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | cp932              |
| character_set_connection | cp932              |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | cp932              |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | cp932_japanese_ci  |
| collation_database       | utf8mb4_general_ci |
| collation_server         | utf8mb4_general_ci |
+--------------------------+--------------------+

 

ちょいちょい調べると、my.iniに以下の定義も加える必要があったようです

my.iniの変更

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4

 

上記設定を加えてもっかい再起動すると以下のようになりました、ふぅ(*´・∀・)

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8mb4_general_ci |
| collation_server         | utf8mb4_general_ci |
+--------------------------+--------------------+

 

あとはテーブルの定義も注意、カラム名のところとかテーブル自体のdefault charasetを確認してみてください

SHOW CREATE TABLE table_name;
↓とか、あとカラム定義のところにもあるので注意
ENGINE=InnoDB AUTO_INCREMENT=96 DEFAULT CHARSET=utf8mb4

 

python側の定義

とりあえず、前段のMySQLの定義は全部キレイになった、でもプログラムを実行すると同じエラーが解消されない・・・

キィーッ、発狂する~。:.゚ヽ(´∀`。)ノ゚.:。 ゜

わたしはpythonからMySQLに接続するのに「mysql.connector」を使っています
こちらも調べるとそこそこ出てくるので接続からSQL実行などは難しくありません

っで、問題はコイツの接続時の定義でした。

最初わたしは以下のように接続していました

import mysql.connector

def db_connect():
    connect = mysql.connector.connect(
        host='localhost',
        port='3306',
        user='root',
        password='パスワード',
        database='DB名'
    )

    return connect

うーん、もしかして接続時もcharsetの定義あるんじゃないの?みたいな疑問が出てきて、マニュアルを見てみると、おー、charsetの引数があるじゃない!?

 

以下のように変更してみたところ、無事にinsertすることが出来ました~~~(๑˃̵ᴗ˂̵)و

import mysql.connector

def db_connect():
    connect = mysql.connector.connect(
        host='localhost',
        port='3306',
        user='root',
        password='パスワード',
        database='DB名',
        charset='utf8mb4'
    )

    return connect

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です