Php 如何解码Firebird中的blob

Php 如何解码Firebird中的blob,php,firebird,firebird2.5,Php,Firebird,Firebird2.5,我有一个外部应用程序,它将一些数据保存到Firebird数据库。我需要在PHP应用程序中读取这些数据(但也可以是Java或其他语言) 数据与字段MY_字段一起保存在表MY_表中 MY_字段的类型为[BLOB SUB_类型1] 我可以使用SQL查询将项目从外部应用程序导出为文件,例如: INSERT INTO MY_TABLE (MY_FIELD) VALUES ('20.00;0.28478;0.32461;0.38308;0.44478;0.51408;0.59144;0.66252;0.72

我有一个外部应用程序,它将一些数据保存到Firebird数据库。我需要在PHP应用程序中读取这些数据(但也可以是Java或其他语言)

数据与字段MY_字段一起保存在表MY_表中

MY_字段的类型为[BLOB SUB_类型1]

我可以使用SQL查询将项目从外部应用程序导出为文件,例如:

INSERT INTO MY_TABLE (MY_FIELD) VALUES ('20.00;0.28478;0.32461;0.38308;0.44478;0.51408;0.59144;0.66252;0.72157;0.78807;0.86791;0.96909;1.0557;1.1364;1.2523;1.3681;1.4814;1.6107;1.7551;1.8755;2.0008;2.1728;2.3557;2.5319;2.7193;2.9123;3.1122;3.3309;3.5565;3.8044;4.0627;4.3347;4.5754;4.8581;5.0925;5.3717;5.6047;5.835;6.0827;6.3306;6.5275;6.7589;6.9458;7.1962;7.3849;7.5213;7.6636;7.7756;7.8486;7.9299;7.9847;7.976;7.8689;7.8012;7.6962;7.611;7.5166;7.4203;7.3154;7.1768;7.0413;6.8516;6.6693;6.4958;6.2994;6.1245;5.9358;5.7431;5.5659;5.3819;5.1849;5.0036;4.821;4.639;4.4637;4.2965;4.1315;#...');
当我使用PHP读取记录时,我可以读取:

0x000003cb00000082

代码如下:

$query = 'SELECT MY_FIELD FROM MY_TABLE';
$result = ibase_query($firebirdConnection, $query);
$row = ibase_fetch_assoc ($result);
echo $row['MY_FIELD'];
$result = ibase_query($firebirdConnection, $query);
$row = ibase_fetch_assoc ($result, IBASE_TEXT);
echo $row['MY_FIELD'];

我知道这是本文的二进制版本。我试着用php解码它

我使用了ibase_blob_echo函数,得到了不同字符的混合:


x�%�Ǎ1��E������w?S%�h\E����,�6.��\G��E�]�Y&��r8n5tW���_��3.�¶�E'���K�lS�*>GS(�B�$�ť��]�3$1�R�v�E���HRSn�Z�����I6���Z3e��apj\־�v��-@w4�)����x���D�[�����/W�1.�5O�+3.��eT�fQM�我`����抄送-���
blob sub_type 1
(或
blob sub_type text
)用于文本数据,而不是二进制数据。对于二进制数据,您需要使用
blob sub_type binary
(或
blob sub_type 0
)。但是,由于您似乎插入了文本数据,这应该不是问题,但是您解码的值在本质上似乎是二进制的。如果没有更多关于它实际上是什么类型的数据的详细信息,就不可能回答这个问题。“我理解这是此文本的二进制版本”-不,这是一个必须用于获取blob数据段的“blob句柄”值。如果您可以通过简单的
insert
填充该blob,则该blob中的值应该很短。当我添加IBASE\U文本标志时,您可以尝试
从我的\u表中选择CAST(我的\u字段为VARCHAR(8190))-您上面和下面的代码相同,没有删除或添加任何内容您在应用程序的连接中指定了什么
字符集
?在创建blob字段时为其指定了什么
字符集
(它可以隐式地从当时的连接字符集继承一个)?您的应用程序似乎猜不到文本编码……您可以尝试
ibase\u blob\u get
查看原始数据,然后将其转换为可读文本。但是,由于
但它也可以是Java或其他语言
,因此最好确保始终指定连接字符集。在Java中,使用Jaybird(Firebird JDBC驱动程序),您可以使用
getString
getCharacterStream
(如果是字符串值),或
getBytes
getBinaryStream
(如果是二进制值),或-IMHO一个更令人沮丧的API-
getClob
/
getBlob
,来获取值。
$result = ibase_query($firebirdConnection, $query);
$row = ibase_fetch_assoc ($result, IBASE_TEXT);
echo $row['MY_FIELD'];