使用 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,而不是 CHAR
或 VARCHAR
。我自己不使用 PHP,但我相信 PHP 的 Firebird/Interbase 驱动程序需要您明确请求 blob。
您看到的 ID
和 Name
的值是可用于请求 blob 的 blob ID。
您有两个选择:
- 使用这些 blob id 请求 blob 值,请参阅
ibase_blob_open
and ibase_blob_get
(afaik,您需要自己进行正确的字节到字符的转换)
- 将值转换为
VARCHAR
(例如 CAST(LIST(t."ID", ',') AS VARCHAR(2048)) AS ID
)
第二个选项的缺点是,如果你可以得到很长的结果,那么你还需要转换为一个很长的VARCHAR
,否则你会得到截断错误;不幸的是,varchars 被限制为 32K-2 字节(UTF8 为 8191 个字符),整行限制为 64K 字节。
我有一些非常奇怪的情况。我正在查询 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,而不是 CHAR
或 VARCHAR
。我自己不使用 PHP,但我相信 PHP 的 Firebird/Interbase 驱动程序需要您明确请求 blob。
您看到的 ID
和 Name
的值是可用于请求 blob 的 blob ID。
您有两个选择:
- 使用这些 blob id 请求 blob 值,请参阅
ibase_blob_open
andibase_blob_get
(afaik,您需要自己进行正确的字节到字符的转换) - 将值转换为
VARCHAR
(例如CAST(LIST(t."ID", ',') AS VARCHAR(2048)) AS ID
)
第二个选项的缺点是,如果你可以得到很长的结果,那么你还需要转换为一个很长的VARCHAR
,否则你会得到截断错误;不幸的是,varchars 被限制为 32K-2 字节(UTF8 为 8191 个字符),整行限制为 64K 字节。