首页 > 解决方案 > 如何在 Firebird 中将 BLOB SUB_TYPE 0 转换为 TEXT?

问题描述

我的 Firebird 数据库表中有一个数据类型为 BLOB SUB_TYPE 0(默认)的字段。如何在 PHP Web 服务 SQL 查询中使用 SELECT 查询将内容查看为文本/字符串?

我正在尝试这个:

<?php 
  
$str_conn="firebird:host=localhost;dbname=C:\Temporal\POLICLINICA.GDB;charset=utf8";
     
$dbh = new PDO($str_conn, "SYSDBA", "masterkey");

$res=$dbh->query("SELECT COD_PACIENTE, CONVERT(TRATAMIENTO USING utf8) AS TREAT, SESIONES FROM GES_FISOTERAPIA");

$datos = array();

foreach ($res as $row) {
    $datos[] = $row;
}

echo json_encode($datos);

?>

包含 blob 类型的“Tratamiento”列,但返回错误。

我必须阅读 web 服务中的列,因为我无权将数据库中的格式更改为 TEXT 或 VARCHAR。

标签: phpblobfirebird

解决方案


Ablob sub_type 0blob sub_type binary, 并且包含二进制数据。如果您确定它实际上是字符数据,并且使用的字符集是 UTF8,那么您可以显式转换它:

cast(TRATAMIENTO as blob sub_type text character set utf8)

如果你需要varchar,你需要做

cast(cast(binval as blob sub_type text character set utf8) as varchar(8191))

或者

cast(cast(binval as varchar(8191) character set binary) as varchar(8191) character set utf8)

这看起来很复杂,但我需要这样做,因为它看起来从二进制 blob 直接转换为带有字符集的 varchar 不起作用(至少,我在 Firebird 3 中得到了非 ASCII 字符的无效结果)。

我认为这是一个错误,使用cast(binval as varchar(8191) character set utf8)应该可以工作(但现在不行)。

请注意,以这种方式转换为 varchar 时,值的最大长度受到限制:单字节字符集为 32765,对于(最大)4 字节字符集(如 utf8)为 8191。

您可能需要实际使用 blob,并显式读取 blob。


推荐阅读