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';
以上