我有一些非常奇怪的情况。我正在查询 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 日期 = 2015 年 10 月 23 日名称 = Математика (тест),География(тест)
PHP 结果:
ID => 0x0000000200000000, Date => 2015-10-23, Name => 0x0000000500000000
当使用 ibase_connect() 连接到数据库时,我使用的是“UTF-8”编码,数据库编码是 WIN1251。
最佳答案
LIST()
的结果类型是一个 blob,不是 CHAR
或 VARCHAR
。我自己不使用 PHP,但我相信 PHP 的 Firebird/Interbase 驱动程序需要您明确请求 blob。
您看到的 ID
和 Name
的值是可用于请求 blob 的 blob ID。
你有两个选择:
- 使用这些 blob id 请求 blob 值,参见
ibase_blob_open
和ibase_blob_get
(afaik,您需要自己进行正确的字节到字符的转换) - 将值转换为
VARCHAR
(例如CAST(LIST(t."ID", ',') AS VARCHAR(2048)) AS ID
)<
第二个选项的缺点是,如果你能得到很长的结果,那么你还需要转换成一个长的VARCHAR
,否则你会得到截断错误;不幸的是,varchars 被限制为 32K-2 字节(UTF8 为 8191 个字符),而一行作为一个整体被限制为 64K 字节。
关于php - 使用 PHP 时未从 firebird 数据库接收到正确的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33916720/