MySQLデータベースリストア時の「Incorrect string value」エラー (1366) の対処法

DBeaverでのMySQLデータ復元中に発生する文字コードエラーの解決策

DBeaverなどのデータベース管理ツールを使用してMySQLデータベースを復元(リストア)する際、特に「ERROR 1366 (HY000): Incorrect string value: '\\xAE\\xE6\\x96\\x99' for column 'name' at row 1」のようなエラーメッセージに遭遇することがあります。 この問題は通常、復元処理を実行するクライアントツール(例えばmysqlコマンドラインクライアント)が、SQLダンプファイルの内容と異なる文字エンコーディングをデフォルトで使用している場合に発生します。特に、絵文字や一部の特殊文字(4バイトUTF-8文字)が含まれているデータで顕著です。

このエラーを解決するための核心は、復元ツールに明示的に--default-character-set=utf8mb4パラメータを渡すことです。これにより、SQLファイルがutf8mb4エンコーディングで読み込まれ、データが正しくデータベースに送信されるようになります。

方法1: DBeaverの「ツール」メニューからのネイティブコマンド実行(推奨)

DBeaverのGUIでは、直接コマンドライン引数を追加する入力欄が見当たらない場合があります。最も確実な方法は、DBeaverの「ツール」機能を使って、追加パラメータを付与したmysqlコマンドを直接実行することです。

  1. SQLファイルの準備: 復元したいSQLダンプファイル(例: backup.sql)がローカルディスクに保存されていることを確認します。
  2. 「ツール」メニューを開く: DBeaverのトップメニューから「ツール (Tools)」→「実行 (Execute)」を選択します。または、対象のデータベース接続を右クリックし、「ツール」→「実行」を選びます。
  3. ネイティブクライアントの設定: 表示されたウィンドウで、以下の手順を実行します。
    • 「クライアント (Client)」のドロップダウンメニューから「mysql」を選択します(mysqldumpではないことに注意)。
    • 「パラメータ (Parameters)」または「コマンド (Command)」の入力欄に、以下のコマンドを入力します。
    --default-character-set=utf8mb4 -u [DBユーザー名] -p [ターゲットDB名] < "[SQLファイルへのパス]"
    

    各プレースホルダーを実際の情報に置き換えてください。

    • [DBユーザー名]: データベースのユーザー名(例: root)
    • [ターゲットDB名]: データを復元したいデータベースの名前
    • [SQLファイルへのパス]: バックアップファイルの完全なパス(例: C:\backups\my_db_2023.sql)
    DBeaverは通常、ホストとポート情報を自動で処理しますが、外部ターミナルで実行する場合は-h 127.0.0.1 -P 3306のような引数が必要になる場合があります。

  4. 実行: 「実行 (Run)」または「実行 (Execute)」ボタンをクリックします。DBeaverは指定されたutf8mb4パラメータと共に、ローカルのMySQLクライアントを呼び出し、復元処理を実行します。

方法2: DBeaverのリストアウィザードでの設定確認(バージョンに依存)

DBeaverのグラフィカルなリストアウィザード(データベースを右クリック → ツール → リストア)もmysqlコマンドを内部的に使用していますが、バージョンによっては文字セット設定のオプションを提供している場合があります。

  1. 対象データベースを右クリック → 「ツール」 → 「リストア」を選択します。
  2. バックアップファイルのパスを選択後、「次へ」をクリックします。
  3. 「オプション (Options)」または「設定 (Settings)」ページを注意深く確認します。
    • 「文字セット (Charset)」オプションがある場合は、utf8mb4を手動で選択または入力します。
    • このオプションが存在しない場合、そのバージョンのGUIはカスタムの文字セットパラメータをサポートしていないため、方法1を適用してください。

方法3: Dockerコンテナ内での実行

もしMySQLがDockerコンテナとして稼働している場合は、ホストマシンからdocker execコマンドを使用して直接コンテナ内で復元を実行するのが最も効率的です。

# 構文
docker exec -i [コンテナ名] mysql -u [DBユーザー名] -p[パスワード] [ターゲットDB名] --default-character-set=utf8mb4 < "[ローカルSQLファイルへのパス]"

# 実行例
docker exec -i my_mysql_server mysql -u admin_user -psecure_password my_database --default-character-set=utf8mb4 < ./data_dump.sql

根本原理の解説

なぜこのパラメータが必要なのでしょうか? mysqlクライアントは、デフォルトでutf8(MySQLの3バイトUTF-8エンコーディング)やシステムに設定されたデフォルトのエンコーディングでSQLファイルを読み込もうとすることがあります。しかし、SQLファイルに絵文字や一部の東アジア言語の文字など、4バイトを必要とするUTF-8文字が含まれている場合、クライアントはこれらの文字を誤って切り詰めたり、不正な形式に変換したりしてしまいます。その結果、データベースにデータを送信する際に「Incorrect string value」エラーが発生するのです。

--default-character-set=utf8mb4パラメータは、クライアントに対して「このSQLファイルをutf8mb4形式で読み込み、そしてutf8mb4形式でサーバーに送信してください」と明示的に指示します。これにより、データが転送プロセス中にエンコーディング変換エラーを起こすことなく、データベースに正しく格納されるようになります。

タグ: MySQL DBeaver utf8mb4 文字コード データベース復元

10月21日 19:12 投稿