簡體   English   中英

mysqldump如何將二進制數據寫入文件以進行MySQL邏輯備份?

[英]How does mysqldump write binary data into files for MySQL logical backup?

我正在使用mysqldump備份表。 該架構如下:

CREATE TABLE `student` (
  `ID` bigint(20) unsigned DEFAULT NULL,
  `DATA` varbinary(64) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我可以使用以下命令將表中的數據備份。

mysqldump -uroot -p123456 tdb> dump.sql

現在,我想使用MySQL C接口編寫自己的代碼,以生成類似於dump.sql的文件。 所以我只是

  • 讀取數據,並將其存儲在int char * p中(使用函數mysql_fetch_row);
  • 使用fprintf(f,“%s”,p)將數據寫入文件;

但是,當我檢查寫入文件的表字段時,發現mysqldump和我自己的程序生成的文件不同。例如,

  • mysqldump '[[ \\\\^X\\í^G\\ÑX` C;·Qù^Dô7<8a>¼!{<96>aÓ¹<8c> HÀaHr^Q^^½n÷^Kþ<98>IZ<9f>3þ'
  • 我的程序生成的文件中的一個數據字段[[ \\^Xí^GÑX` C;·Qù^Dô7<8a>¼!{<96>aÓ¹<8c> HÀaHr^Q^^½n÷^Kþ<98>IZ<9f>3þ

因此,我的問題是:為什么使用sprintf(f,“%s”,xx)進行備份寫入數據不正確? 僅在字符串的開頭和結尾添加''就足夠了嗎? 如果是這樣,如果該字段的數據恰好包含'怎么辦?

另外,我想知道將一些不可打印的字符寫入文本文件意味着什么。


另外,我閱讀了stackoverflow.com/questions/16559086並嘗試了--hex-blob選項。 如果我將二進制數據的每個字節轉換為十六進制形式,然后將簡單的文本字符串寫入dump.sql,可以嗎?

然后,而不是得到'[[ \\\\^X\\í^G\\ÑX` C;·Qù^Dô7<8a>¼!{<96>aÓ¹<8c> HÀaHr^Q^^½n÷^Kþ<98>IZ<9f>3þ'我得到類似0x5B5B095C18ED07D1586009433BB751F95E44F4378ABC217B9661D3B98C0948C0614872111EBD6EF70BFE98495A9F33FE的字樣!

但是,如果選擇此方法,我想知道當我使用latin1以外的其他編碼方案時是否會遇到問題。

另外,以上這些都是我自己的想法,我也想知道還有其他使用C接口備份數據的方法。

謝謝您的幫助!

latin1utf8等是CHARACTER SETs 它們適用於TEXTVARCHAR列, 不適用於 BLOBVARBINARY列。

使用--hex-blob是一個好主意。

如果TEXTCHAR有“無法打印的字符”,則說明您試圖將BLOB放入(頑皮),或者未為適當的字符集設置打印機制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM