php - 如何在 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。
解决方案
Ablob sub_type 0
是blob 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。
推荐阅读
- android - CardView 不显示任何数据
- python - 如何在 scipy.optimize.minimize 中构建 x[0] + x[1] > 0 约束?
- sql - SQL WHEN 函数 - 如何修复语法错误?
- r - 将整数分布在几行上的次数与除以常数一样多
- javascript - 基于流行度的Div自动放置
- mysql - sql从具有日期范围条件的表中选择
- python - pip install 抛出与 setup.py 中的函数相关的错误
- c# - 如何以编程方式访问 IFC 映射文件?
- javascript - 怎么做两个
- java - Selenium 中的 FluentWait 如何实现 until() 方法