Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL 5.0:以(格式良好的)XML格式输出BLOB数据?_Mysql_Xml_Formatting_Hex_Blob - Fatal编程技术网

MySQL 5.0:以(格式良好的)XML格式输出BLOB数据?

MySQL 5.0:以(格式良好的)XML格式输出BLOB数据?,mysql,xml,formatting,hex,blob,Mysql,Xml,Formatting,Hex,Blob,我正在为MySQL编写一个web接口,它执行两个查询并返回一些XML数据和查询结果。现在,运行查询的表有三个LONGBLOB列(用于存储图像数据等) 然而,当我试图解析XML时,BLOB列中的某些字符使我遇到了麻烦:看起来MySQL只是将直接的十六进制数据转储到流中,我的解析器不接受这些数据 有没有办法让MySQL输出包含十六进制数据的格式良好的XML?我查看了mysqldump--hex blob选项,但我正在使用mysql程序,因为我需要在表上运行查询,而不仅仅是获取整个表的内容。我可以使用

我正在为MySQL编写一个web接口,它执行两个查询并返回一些XML数据和查询结果。现在,运行查询的表有三个LONGBLOB列(用于存储图像数据等)

然而,当我试图解析XML时,BLOB列中的某些字符使我遇到了麻烦:看起来MySQL只是将直接的十六进制数据转储到流中,我的解析器不接受这些数据

有没有办法让MySQL输出包含十六进制数据的格式良好的XML?我查看了
mysqldump--hex blob
选项,但我正在使用
mysql
程序,因为我需要在表上运行查询,而不仅仅是获取整个表的内容。我可以使用字符串表示法、
标记中的
xs:hexBinary
元素或任何类似的东西

编辑:我使用的是PHP5.2.9。问题的背景是提供一种类似Digg的API,具有多个HTTP可访问的端点,例如
/objects
/edit
,等等。其思想是,跨多个平台的许多客户端应用程序可以将API用作访问同一数据集的公共基础,而不必关心支持它的数据库(可能会发生更改)

我存储的对象类型之一是一个(小)图像,我希望使用MySQL LONGBLOB类型直接在数据库中存储。(我只负责让API与MySQL后端数据库一起工作,因此答案可以将DB类型、语言和实用程序视为给定内容。)基本上,我想做的是找到一种方法,在相同的XML文档中将图像提供给请求应用程序,作为其他一些混合类型的数据(主要是字符串)


Edit:我将使用
MySQL--XML
命令行程序和PHP
passthru
函数的组合从MySQL中获取XML。这是在我开发它的时候实现我想要的最简单的方法;有更好的办法吗?我应该从MySQL字段用PHP构建XML,而不是依赖MySQL来为我构建XML吗?如果是这样的话,这会使以XML格式发送图像数据变得更容易吗?

XML不支持直接存储二进制数据,请使用Base64编码。

您不能将直接的二进制数据放入XML文档中。如果将编码中的任何有效字符(可能是UTF-8)放入CDATA节中,则可以将其放入XML文档中(并且该字符不包含字符串“<![CDATA[”),但原始二进制数据中的UTF-8序列无效。您需要将二进制数据转换为某种文本表示形式

使用xs:hexBinary格式(即[0-9A-F]{2})将为二进制数据的每个字节生成2个字符(字节)

使用Base64编码时,每3个字节的数据(2^8/2^6)使用4个字符,因此它是一种更有效的格式。不幸的是,从MySQL执行此操作是非常困难的,因此最好以二进制格式从MySQL提取数据,并在web应用程序中将其编码为Base64

编辑:似乎在解析CDATA部分。我在“!”周围添加了空格,以使其停止解析并改进格式

编辑:

在不太了解您正在做什么的情况下,让我概述一下实现这一点的一种方法:

// ... setup and exec query...
while ($row = mysql_fetch_assoc($rs)) {
    print('<item>');
    print('<date>' . $row['date'] . '</date>');
    // ... etc. ...
    // more efficient to use mysql_result but this is simpler
    $img = $row['image'];
    print('<image>' . base64_encode($img) . '</image>');
    // CDATA is *probably* not needed
    print('<image><![CDATA[' . base64_encode($img) . ']]></image>');
    // or, if you decide you want hex format anyway...
    print('<image>' . unpack('H*', $img) . '</image>');
}
/…设置和执行查询。。。
while($row=mysql\u fetch\u assoc($rs)){
打印(“”);
打印('.$row['date'.');
//……等等。。。
//使用mysql\u结果更有效,但这更简单
$img=$row['image'];
打印(“”.base64_编码($img)。“”);
//CDATA*可能*不需要
打印(“”);
//或者,如果你决定要十六进制格式。。。
打印(''.unpack('H*',$img.'');
}

这将产生严格有效的XML。想想看,您现在拥有的十六进制数据在XML中应该很好。您使用的解析器是什么?

它可能会使UTF8编码图像更容易,如果您使用mysql查询并在php中构建XML,也会使您的站点更具响应性……Fork和exec是昂贵的操作

您可以使用并执行以下操作:

$myxml->addChild('imageBlob', base64_encode($mysql_row['imageBlob']));

你能对此进行一些扩展吗?我如何让mysql以XML格式输出“base64编码”?即使是指向某个地方的文档的链接也会很感激。谢谢你提供的信息!我更新了这个问题,以提供有关环境和预期用途(PHP)的更多信息。@Codebender:尝试在内联代码周围使用反勾号:像
应该产生
(如果我的评论没有被弄糟的话…)主要使用iPhone XML解析器。这确实有帮助,并且让我在图像编码方面走上了正确的道路(以及更好的从服务器到客户端传输图像的方法)。谢谢@Codebender!从您的描述中,我得到的印象是您直接从MySQL(通过存储过程)获取XML,而不是从XML中获取字段并在PHP中构建XML。是这样吗?您可以提供一些伪代码或其他东西,或者提供一个导致问题的XML示例吗?您考虑过将文件存储在磁盘上,并将其名称保留在数据库中,对吗?不过,一旦获得图像数据,基本思想是相同的。