【问题标题】:mysqldump exporting data in a bad character setmysqldump 以错误的字符集导出数据
【发布时间】:2013-03-21 01:17:21
【问题描述】:

昨天第一次导出Mysql数据库,发现dump中有一些很奇怪的字符,比如:

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_databasecollation_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。

【问题讨论】:

  • 您看到这些角色的地方应该是什么?您究竟是如何看待这些角色的?
  • 我用 ZendStudio 打开 sql 文件时看到这些字符。
  • 您期望那里的数据是什么?
  • 这里的解决方案也适用于这种情况:stackoverflow.com/a/17756257/802117

标签: mysql utf-8 character-encoding mysqldump latin1


【解决方案1】:

根据表名“piwik_archive_blob_2013_01”,我猜包含奇怪字符的列是BLOB类型。

BLOB 列包含二进制数据。这就是为什么它包含这些奇怪的字符。这是意料之中的。

别担心,我很确定 MysqlDump 知道如何转储这些数据。

干杯, 埃里克。

【讨论】:

  • 你会惊讶于 mysqldump 做了什么和不知道什么......它非常不智能,并且会很乐意生成需要小心取消导入的无聊文件。
  • --hex-blob 通常适用于二进制数据。正如这个答案所说,字符集解决方案不适用于 blob
【解决方案2】:

可能是操作系统在导出过程中更改了字符集并忽略了默认字符集参数。

要确保导出不使用操作系统字符集,请使用参数结果文件

【讨论】:

  • 截至今天,链接似乎已损坏
猜你喜欢
  • 2014-12-18
  • 2013-02-06
  • 1970-01-01
  • 2011-08-16
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
相关资源
最近更新 更多