我在 HTML 表中显示 Firebird 查询中的 BLOB 字段时遇到问题。
该字段包含:“清扫地板。”
在 HTML 表中显示为:“0x00ea9572000001ec”
BLOB 仅包含字符。基于此,我找到了代码行
cast(RECORDEDNOTES as blob sub_type text character set utf8) as CONVERTED_RECORDEDNOTES
,我在其中更改了字段名称并添加了别名,但出现了以下错误。我也试过:cast(RECORDEDNOTES as VARCHAR(250)) as CONVERTED_RECORDEDNOTES
两者都造成了错误:
动态 SQL 错误 SQL 错误代码 = -104 令牌未知 - 第 2 行,列 45、
这是 SQL 语句中代码开始的地方。
后者在 DBeaver 中工作,但在 PHP 中它创建了上述错误,而不是错误的输出。
如何转换 BLOB 数据?我是在查询中执行此操作还是使用生成的查询数据执行此操作?
我使用为 Firebird SQL 编写的以下 PHP 函数。它非常适合我使用和不使用 BLOB 字段的查询来检索其记录。它检测给定查询中是否存在任何 BLOB 字段。读取记录时,如果存在BLOB字段,则读取该BLOB字段的内容。它可以处理没有和有(多个)BLOB 字段的查询。
function selectSQLarray($sql) {
$dataArr = array();
/* Attempt to connect to Firebird database */
$link = ibase_connect (DB_DATABASE, DB_USERNAME, DB_PASSWORD);
$rid = @ibase_query ($link, $sql);
if ($rid===false) var_dump($sql); //errorHandle(ibase_errmsg(),$sql);
$coln = ibase_num_fields($rid);
$blobFields = array();
/* Get all blob fields from result */
for ($i=0; $i < $coln; $i++) {
$col_info = ibase_field_info($rid, $i);
if ($col_info["type"]=="BLOB") $blobFields[$i] = $col_info["name"];
}
/* Read each row from query result */
while ($row = ibase_fetch_object ($rid)) {
/* put each blob data into the field */
foreach ($blobFields as $field_num=>$field_name) {
try {
$blobid = ibase_blob_open($row->$field_name);
if ($blobid == false) {
$row->$field_name = '';
} else {
$row->$field_name = ibase_blob_get($blobid,102400);
ibase_blob_close($blobid);
}
}
catch(Trowable $t) {
$row->$field_name = '';
}
}
$dataArr[] = $row;
}
ibase_close ($link);
return $dataArr;
}