Python | Django | 問題解決 | “django.db.utils.OperationalError:(1366, Incorrect string value:”

DjangoとReact, MariaDBを利用したWebアプリの一部を開発し,入力欄に日本語を入力したところ,以下のようなエラーが出現した.

django.db.utils.OperationalError: 
(1366, "Incorrect string value: '\\xE3\\x83\\x9B\\xE3\\x83\\xAB...'
for column `sdsdb`.`sdsapp_chemicalsubstance`.`chemical_name_jp` at row 1")

上記エラーの解決方法をこちらの記事にて記す.

実施環境

各バージョンの確認方法はこちら

OS: Windows11
Python 3.11.1
Django 5.1.2
pipenv version 2022.11.30
MariaDB: 10.10.3

エラーの内容

DjangoとReact, MariaDBを利用したWebアプリの一部を開発し,入力欄に日本語を入力したところ,以下のようなエラーが出現した.

django.db.utils.OperationalError: 
(1366, "Incorrect string value: '\\xE3\\x83\\x9B\\xE3\\x83\\xAB...
' for column `sdsdb`.`sdsapp_chemicalsubstance`.`chemical_name_jp` at row 1")

以下のunicode character setに問題がありそうなので,確認をする.

  • Database: sdsdb
  • Table: sdsapp_chemicalsubstance
  • Column: chemical_name_jp

エラーの解決方法

現状確認

MariaDB(database)の"character set"と"collation"をチェックする.

  • Character Set: databaseがどの種のcharacter(文字)を保管するかを決める.
  • Collation: characterがどのように並び,比較されるのかを決める.sortやfilterに重要となる.

Character Set

以下コマンドはdatabaseの"character set"を確認する.確認の結果,"latin1″であることが分かった.日本語を利用するので,"utf8mb4″にする必要がある.

MariaDB [sdsdb]> show variables like 'character_set_database';

+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| character_set_database | latin1 |
+------------------------+--------+
1 row in set (0.006 sec)

Collation

以下コマンドはdatabaseのcollationを確認する.確認の結果,"latin1_swedish_ci"であることが分かった.日本語を利用するので,"utf8mb4_unicode_ci"や"utf8mb4_bin", “utf8mb4_general_ci"などにする必要がある.

MariaDB [sdsdb]> show variables like 'collation_database';

+--------------------+-------------------+
| Variable_name      | Value             |
+--------------------+-------------------+
| collation_database | latin1_swedish_ci |
+--------------------+-------------------+
1 row in set (0.001 sec)

DatabaseのCharacter SetとCollationを更新

以下コマンドにより,databaseの更新をする.

MariaDB [sdsdb]> ALTER DATABASE sdsdb CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

以下コマンドにより,更新されたかを確認する.

MariaDB [sdsdb]> show variables like 'character_set_database';

+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| character_set_database | utf8mb4 |
+------------------------+---------+
1 row in set (0.002 sec)


MariaDB [sdsdb]> show variables like 'collation_database';

+--------------------+--------------------+
| Variable_name      | Value              |
+--------------------+--------------------+
| collation_database | utf8mb4_general_ci |
+--------------------+--------------------+
1 row in set (0.001 sec)

TableとCharacter SetとCollationを更新

以下コマンドにより,Tableの更新をする.

MariaDB [sdsdb]> ALTER TABLE sdsapp_chemicalsubstance CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

以下コマンドにより,更新されたかを確認する.

MariaDB [sdsdb]> show table status from sdsdb where name = 'sdsapp_chemicalsubstance';

以上

MariaDB,PythonDjango

Posted by クマガイ