我正在亚马逊的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数据相同。任何提示将不胜感激。
答案 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数据。