【发布时间】: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