如何在 Firebird 中将 BLOB SUB_TYPE 0 转换为 TEXT?

Mim*_*ico 4 php firebird blob

我的 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);

?>
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*eel 5

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

cast(TRATAMIENTO as blob sub_type text character set utf8)
Run Code Online (Sandbox Code Playgroud)

如果您需要varchar,则需要执行以下任一操作

cast(cast(binval as blob sub_type text character set utf8) as varchar(8191))
Run Code Online (Sandbox Code Playgroud)

或者

cast(cast(binval as varchar(8191) character set binary) as varchar(8191) character set utf8)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 谢谢,马克·罗特维尔!这解决了我的问题!我尝试了一些建议的解决方案,最后它起作用了:“cast(TRATAMIENTO as varchar(8191) character set utf8)”。:D (2认同)