6

昨日、初めて Mysql データベースをエクスポートしたところ、次のような非常に奇妙な文字がダンプに見つかりました。

INSERT INTO `piwik_archive_blob_2013_01` VALUES (15,'Actions_actions_url_6',1,'2013-01-17','2013-01-17',1,'2013-01-20 07:36:53','xuNM0ý/œ#&ÝÕ³\ZõNYpÊÀì#!üw7Hж}°ÀAáZoN*šgµ\'GWª[Yûðe¯57 ÃÁÆ7|Ÿ\'Ü%µDh©-EÛ^ËL±ÕÞtªk@(,b±ßZ.ÒÃ6b²aiÓÍ)87[­ïÎœ,æya¥uÒ<|+íª7MNuïÝ¿8ñ%1Ʊ>Ú­X');

私のサーバー MySQL のバージョンは 5.1.66-0+squeeze1 (Debian) です。このデータベースは、Piwikセットアップ スクリプトによって自動的に作成されました。

この問題を解決しようとしたのは次のとおりです。

#1 まず、データベースの文字セットを確認しました。

> show table status;

26 個のテーブルには、非常に正常に聞こえる照合 utf8_general_ci があります。mysqldump が別の文字セット (latin1?) でエクスポートされたと推測したので、次のことを試しました。

mysqldump -u user -p**** --all-databases --default-character-set=utf8 | gzip -9 > dump.sql.gz

結果=私はまだ同じ奇妙なキャラクターを持っていました.

注)後で、サーバーのデフォルトの文字セットに関係なく、mysqldumpのデフォルトの文字セットがutf8であることを知りました。だから--default-character-set=utf8駄目だった。

#2 次に、mysql conf を更新することで問題を解決できると考えました。元のconfは次のとおりです。

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

だから私は更新/var/lib/mysql/my.cnfして追加しました:

[mysqld]
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_general_ci
default-character-set=utf8
default-collation=utf8_general_ci

[mysqldump]
default-character-set=utf8

それで

/etc/init.d/mysql restart
mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| 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     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | utf8_general_ci   |
+----------------------+-------------------+

結果=同じ奇妙な文字。

#3 私は変更character_set_databaseしましたcollation_database

mysql> ALTER DATABASE piwik default character SET utf8 collate utf8_general_ci;

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+

結果=同じ奇妙な文字。

#4データベースを作成する前に 、MySQL のデフォルトの文字セット (latin1) を utf8 に変更する必要があることがわかりました。

照合utf8_general_ci(#1) は、データが utf8 に格納されていることを意味します。しかし、mysqldump がデータが latin1 に格納されていると認識し、データを utf8 にエンコードする可能性はありますか? 最後に、データが二重のutf8でエンコードされていることを意味します(ため息)。この場合、どうすれば問題を解決できますか?

ご協力いただきありがとうございます。

ps) Piwik がデータベースのデフォルト文字セットを utf8 に変更する必要がないのはなぜでしょうか。

4

2 に答える 2

0

テーブル名 "piwik_archive_ blob _2013_01" によると、奇妙な文字を含む列は BLOB 型であると推測されます。

BLOB 列にはバイナリ データが含まれます。そのため、これらの奇妙な文字が含まれています。これは予期されることです。

心配する必要はありません。MysqlDump はこのデータをダンプする方法を知っているはずです。

乾杯、エリック。

于 2014-03-22T22:30:39.407 に答える
0

エクスポート中にオペレーティング システムが文字セットを変更し、default-character-set パラメータを無視している可能性があります。

エクスポートがオペレーティング システムの文字セットを使用していないことを確認するには、パラメーター result-file を使用します。

于 2017-03-18T12:44:01.450 に答える