MySQL blob dump в файлы с разделителями табуляции - PullRequest
1 голос
/ 04 марта 2011

Я перевожу базу данных MySQL 5.1 в Amazon EC2, и у меня возникают таблицы проблем с типом данных 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 (идентичные):

Old:

+--------------------------+----------------------------+
| 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 Ответ

2 голосов
/ 07 марта 2011

Кажется, проблема в mysql (http://bugs.mysql.com/bug.php?id=27724).). Решение заключается не в том, чтобы использовать mysqldump, а в том, чтобы написать собственный скрипт SELECT INTO OUTFILE для таблиц, содержащих данные BLOB-объектов. Вот пример:

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-объектов.

...