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

标签 php encoding utf-8 firebird

我有一些非常奇怪的情况。我正在查询 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,不是 CHARVARCHAR。我自己不使用 PHP,但我相信 PHP 的 Firebird/Interbase 驱动程序需要您明确请求 blob。

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

你有两个选择:

  1. 使用这些 blob id 请求 blob 值,参见 ibase_blob_openibase_blob_get (afaik,您需要自己进行正确的字节到字符的转换)
  2. 将值转换为 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/

相关文章:

php - 是否可以仅对特定引用和 URL 使用 <base> 标记?

python - pandas read_csv 编码奇怪的字符

python - 在 Python 2.7 中打印 UTF-8 字符

python - Scrapy将奇怪的符号导出到csv文件中

unicode - 代理对是如何计算的?

python - 使用 apache 服务器时覆盖 python3 默认编码器

javascript - api 中的 Google map 旅行模式

php - Laravel 请求 : it's correct injecting Request directly in the controller constructor?

php - 向所有用户显示该事件正在进行中

php - 编码 php postgres json_encode