【问题标题】:How does mysqldump write binary data into files for MySQL logical backup?mysqldump如何将二进制数据写入文件进行MySQL逻辑备份?
【发布时间】:2017-02-08 08:42:23
【问题描述】:

我正在使用 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接口备份数据。

感谢您的帮助!

【问题讨论】:

    标签: mysql c character-encoding


    【解决方案1】:

    latin1utf8 等是CHARACTER SETs。它们适用于 TEXTVARCHAR 列, BLOBVARBINARY 列。

    使用--hex-blob 是个好主意。

    如果您在TEXTCHAR 中有“不可打印的字符”,那么您可能一直在尝试将 BLOB 放入这样的文件中——淘气——或者打印机制没有设置为适当的字符集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      相关资源
      最近更新 更多