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

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