MySQL 5.1〜5.5:すべてのUTF-8文字が失われました!

MySQL 5.1〜5.5:すべてのUTF-8文字が失われました!

私はDebianのインストールをMySQL 5.5を使用するようにアップグレードすることにしましたmysql

生成されたSQLファイルを見て、mysqldumpすでにガベージが含まれていることを確認しました。今日私はデータベースを削除し、正常に実行されていた古いデータベースのコピーを取得しましたが、驚くべきことに/var/lib/mysql/database_name/*まだ同じ結果が得られました。

生成されたファイルにはmysqldump次の行が含まれています。

/*!40101 SET NAMES utf8 */;
/*!40101 SET character_set_client = utf8 */;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

/var/lib/mysql/database_name/db.opt古いデータベースと新しいデータベースのデータは同じです。

default-character-set=latin1
default-collation=latin1_swedish_ci

私は今何ができますか?データベース全体を失わないことを願っています!

修正する

show session variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

SELECT charset(name), hex(name), name FROM table WHERE id='123';
+---------------+----------------------------------------------+----------------------------+
| charset(name) | hex(name)                                    | name                       |
+---------------+----------------------------------------------+----------------------------+
| latin1        | 457361C3BA204A6F73C3A92064652053616E74616E61 | Esaú José de Santana     |
+---------------+----------------------------------------------+----------------------------+

最後のコマンドの名前出力は次のようになります。Esaú José de Santana

答え1

MySQLの出力と端末はうまく動作します。問題は、データベース内のテキストがタグ付けされていますが、latin1実際にはエンコードされていることですutf8

この問題は次のように解決できます。

  1. データベースをLatin1ファイルにダンプし、ファイルをUTF-8にインポートします。 MySQL文字エンコーディングの不一致を修正;または
  2. MySQLでは、次binaryを変換して誤ったエンコーディングを無視します。

    UPDATE table SET column=CONVERT(CONVERT(column USING binary) USING utf8) WHERE id=123;
    

    MySQLの列エンコーディングの混乱を修正

答え2

@CLの答えです。デバッグの面で多くの役に立ちましたが、その逆は本当です。データベースとバックアップファイルはどちらもlatin1でエンコードされていますが、クライアントはUTF-8出力を期待しています。

解決策は、character_set_clientlatin1にも設定されていることを確認することです。

[client]
default-character-set = latin1

関連情報