2011-03-04 87 views
1

我正在遷移亞馬遜的EC2中的MySQL 5.1數據庫,並且我有問題表與我們用於圖像存儲的longblob數據類型。基本上,在遷移之後,longblob列中的數據是不同的大小,這是由於字符編碼似乎不同。MySQL blob轉儲到製表符分隔文件

首先,這裏是前一個例子,在遷移後:

老:

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

新:

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

我查的字符集變量在兩臺機器上它們是相同的。我也檢查了'show create table',它們也是一樣的。客戶端都以相同的方式連接(沒有SET NAMES或指定字符集)。

這裏是我用mysqldump命令(I嘗試過不--hex-斑點以及):

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數據是在兩臺機器上是相同的。任何提示將非常感謝。

回答

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數據。

+0

非常感謝,它幫助我找到了解決我的問題的方法,即在php中使用二進制數據編寫文件,然後使用LOAD DATA INFILE加載它。我在PHP中使用bin2hex和hex2bin,它正在工作! – NickT 2011-03-30 19:42:17

+0

很高興幫助。這花了我很多時間才弄清楚,所以我希望它能爲你節省一些時間。 – DrewVS 2011-03-31 02:36:58

相關問題