2014-12-28 32 views
0

我有一個帶有MEDIUMBLOB字段中的音頻數據的mysql數據庫表。事情是,一個音頻文件在不同的行中。所以我想加入他們。當我這樣做:從mysql中的blobs中加入二進制數據

select data from audio where id=1 into outfile "output" fields escaped by ''; 

..我得到的音頻。當我爲id = 2做同樣的事情時,我得到了音頻。當我把它們放在一起:

select data from audio order by date, time into outfile "output" fields escaped by ''; 

..我得到音頻一段時間,然後高幅度的噪音。噪聲從id = 2開始。如果我選擇兩個以上的列放在一起,有時來自該特定ID的輸出是噪聲,有時它是正確的音頻。它不完全交錯。

那麼,如何從多行中提取和連接blob到一個一致的二進制輸出文件?

編輯:這是原始音頻數據。例如。將它讀入Audacity中,你將會導入 - > raw。

+0

爲什麼類型的'音頻'文件包含在二進制數據中? – Steve

+0

@Steve - 原始音頻,16位無符號 –

回答

1

SELECT INTO OUTFILE主要是爲了讓您快速轉儲表格到文本文件,並補充LOAD DATA INFILE

我強烈懷疑SELECT INTO OUTFILE要麼在列之間添加ASCII NULL或其他格式以便可以回讀。

您可以比較二進制輸出以確定這是否爲真,並且還可以選擇其他可能存在的格式,編碼或整形。

您是否必須使用INTO OUTFILE? - 您是否能夠獲取二進制數據,並直接使用腳本或其他中間層創建文件,而不是依賴數據庫?

更新

寫這個,閱讀下面的評論後。我想過CONCAT,MySQL將BLOB值視爲二進制字符串(字節字符串),因此理論上可以將多個列簡單地連接成一個單獨的列。

如果沒有,那麼編寫一個簡單的珍珠,PHP,C,bash或其他腳本語言來查詢數據庫,連接兩個或多個二進制列並將輸出寫入文件系統。

+0

我正在使用'由'字段轉義',因爲我有一個像你之前描述的問題。我想知道如果有什麼可以幫助我(x逃避...)。你的意思是一個SQL腳本來做到這一點?還是另一種編程語言? –

+0

@horsehair我已添加更新 - 對評論有點太大 – Steve

+0

concat無法工作,因爲它會聯繫列而不是行。他希望將不同行中的同一列連接起來。 – Born2Code

1

您需要的是從命令行運行mysql命令,使用-e傳遞要執行的sql語句以及二進制輸出的相應標誌。

然後使用帶有空分隔符的group_concat來連接所有數據。

最後,你輸出到你的文件。唯一需要注意的是group_concat的內置限制,您可以在.ini文件中更改該限制,或者設置全局變量。

這裏是如何將這個樣子:

的mysql --binary模式-e「選擇GROUP_CONCAT從按日期,時間音頻順序(數據分離器‘’);」 -A -B -r -L -N YOUR_DATABASE_NAME>輸出

我剛剛在數據庫中用二進制數據(而不是音頻)嘗試過它,它工作。

+0

將多行連接在一起,除了輸出始終爲1025長,這看起來很有希望,儘管我通過mysql命令行驗證了長度'數據'字段遠遠大於此。 –

+0

這是group_concat_max_len的默認值,正如我在我的回答中指出的那樣,您需要在.ini文件中或通過設置全局變量@@ group_concat_max_len來增加此值,請參閱http://dev.mysql.com/doc /refman/5.1/en/server-system-variables.html#sysvar_group_concat_max_len瞭解更多詳情 – Born2Code

+0

感謝幫助 –