MySQLのエラー『Incorrect String Value』の解決方法

MySQLで『Incorrect String Value』エラーが発生すると、データの挿入や更新が失敗する。このエラーは、データベースの文字エンコーディングと挿入しようとしているデータのエンコーディングが一致しないときに起こる。発生条件と具体的な解決策を解説する。
目次
1. エラーの発生条件
このエラーは、以下のような状況で発生する。
- データベースの文字セットがUTF-8ではなく、特殊文字を正しく扱えない。
- カラムの文字セットが、挿入しようとする文字をサポートしていない。
- クライアントの文字エンコーディングとサーバーのエンコーディングが異なる。
- テーブルの照合順序(collation)が不適切に設定されている。
エラーメッセージの例:
ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x81' for column 'column_name' at row 1
2. 文字セットと照合順序を確認する
データベース、テーブル、カラムの文字セットを確認する。
SHOW CREATE DATABASE database_name;
SHOW CREATE TABLE table_name;
結果に CHARSET=utf8
または CHARSET=utf8mb4
が含まれているかをチェックする。
3. 文字セットをUTF-8MB4に変更する
MySQLのutf8
は4バイト文字をサポートしていないため、絵文字などの特殊文字を扱う場合は utf8mb4
に変更する。
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
4. カラム単位での文字セット変更
特定のカラムの文字セットを変更する場合、以下を実行する。
ALTER TABLE table_name CHANGE column_name column_name TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
5. クライアントの文字セットを確認する
クライアントとサーバーの文字セットが一致していないとエラーが発生する。
SHOW VARIABLES LIKE 'character_set_client';
SHOW VARIABLES LIKE 'character_set_connection';
SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'character_set_server';
値がutf8mb4
でない場合、クエリ実行時に変更する。
SET NAMES utf8mb4;
6. my.cnf(MySQL設定ファイル)を修正する
永続的にutf8mb4
を使用するには、my.cnf
を編集する。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[client]
default-character-set=utf8mb4
設定変更後、MySQLを再起動する。
sudo systemctl restart mysql
7. テーブルのデータをエクスポートして再作成
既存のデータがエンコーディングの変更に対応していない場合、データをエクスポートして新しいテーブルに挿入する。
mysqldump -u root -p --default-character-set=utf8mb4 database_name > backup.sql
テーブルを削除し、エンコーディングをutf8mb4
に設定して作成し直す。
DROP TABLE table_name;
CREATE TABLE table_name (
id INT PRIMARY KEY AUTO_INCREMENT,
text_column TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
);
バックアップデータをインポートする。
mysql -u root -p database_name < backup.sql
8. 特定の文字を手動で変換する
一部の文字がエラーを引き起こす場合、それらを手動で変換する。
UPDATE table_name SET column_name = CONVERT(column_name USING utf8mb4);
9. MySQLのバージョンを確認する
古いバージョンのMySQLでは、utf8mb4
がサポートされていない場合がある。
SELECT VERSION();
MySQL 5.5.3以降でutf8mb4
がサポートされている。古い場合はアップグレードを検討する。
10. MySQLのエラーログを確認する
詳細な情報を取得するために、MySQLのエラーログを確認する。
sudo cat /var/log/mysql/error.log
-
前の記事
Rocky LinuxでのCI/CDパイプライン構築ガイド 2025.03.14
-
次の記事
Avoid using non-primitive value as keyエラーの解決策 2025.03.14
コメントを書く