使用 PHP 时未从 firebird 数据库接收到正确的数据

Not receiving correct data from firebird database when using PHP

我有一些非常奇怪的情况。我正在查询 firebird 数据库,结果与 PHP 中的结果不匹配。在 DB 中,结果很好,但是当涉及到 PHP 时,会有不同的值。

查询:

 SELECT LIST(t."ID", ',') ID,t."Date", LIST(n."Name",',') Name
    FROM "Tests" t
    LEFT JOIN "Names of tests" n ON t."Name ID" = n."ID"
    WHERE t."Locked" = 0
    GROUP BY t."Date"
    ORDER BY t."Date" DESC

数据库中的结果:

ID = 546,552 日期 = 23.10.2015 姓名 = Математика (тест),География(тест)

结果PHP:

  ID   => 0x0000000200000000,
    Date => 2015-10-23,
    Name => 0x0000000500000000

我在使用 ibase_connect() 连接到数据库时使用 "UTF-8" 编码,数据库编码是 WIN1251。

LIST() 的结果类型是一个 blob,而不是 CHARVARCHAR。我自己不使用 PHP,但我相信 PHP 的 Firebird/Interbase 驱动程序需要您明确请求 blob。

您看到的 IDName 的值是可用于请求 blob 的 blob ID。

您有两个选择:

  1. 使用这些 blob id 请求 blob 值,请参阅 ibase_blob_open and ibase_blob_get(afaik,您需要自己进行正确的字节到字符的转换)
  2. 将值转换为 VARCHAR(例如 CAST(LIST(t."ID", ',') AS VARCHAR(2048)) AS ID

第二个选项的缺点是,如果你可以得到很长的结果,那么你还需要转换为一个很长的VARCHAR,否则你会得到截断错误;不幸的是,varchars 被限制为 32K-2 字节(UTF8 为 8191 个字符),整行限制为 64K 字节。