MySQL blob转储到制表符分隔文件

时间:2011-03-04 07:01:09

标签: mysql set blob character mysqldump

我正在亚马逊的EC2中迁移MySQL 5.1数据库,我遇到了用于图像存储的longblob数据类型表。基本上,在迁移之后,longblob列中的数据大小不同,因为字符编码似乎不同。

首先,这是迁移之前和之后的一个例子:

旧:

x??]]??}?_ѕ??d??i|w?%?????q$??+?

新:

x��]]����_ѕ��d��i|w�%�����q$��+�

我检查了两台机器上的字符集变量,它们是相同的。我还检查了'show create table',它们也是相同的。客户端都以相同的方式连接(没有SET NAMES或指定字符集)。

这是我使用的mysqldump命令(我在没有--hex-blob的情况下尝试过它):

mysqldump --hex-blob --default-character-set=utf8 --tab=. DB_NAME

以下是我加载数据的方式:

mysql DB_NAME --default-character-set=utf8 -e "LOAD DATA INFILE 'EXAMPLE.txt' INTO TABLE EXAMPLE;"

以下是MySQL字符集变量(相同):

旧:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | utf8                       | 
| 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                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+

我不知道还有什么可以尝试运行mysqldump并让两台机器上的blob数据相同。任何提示将不胜感激。

1 个答案:

答案 0 :(得分:2)

问题似乎是mysql中的一个错误(http://bugs.mysql.com/bug.php?id=27724)。解决方案是不使用mysqldump,而是为具有blob数据的表编写自己的SELECT INTO OUTFILE脚本。这是一个例子:

SELECT
COALESCE(column1, @nullval), 
COALESCE(column2, @nullval), 
COALESCE(HEX(column3), @nullval), 
COALESCE(column4, @nullval), 
COALESCE(column5, @nullval)
FROM table
INTO OUTFILE '/mnt/dump/table.txt' 
FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';

加载数据:

SET NAMES utf8;
LOAD DATA INFILE '/mnt/dump/table.txt'
INTO TABLE table
FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
(column1, column1, @column1, column1, column1)
SET data = UNHEX(@column1)

这会正确加载blob数据。