2015-11-25 1 views
4

У меня есть очень странная ситуация. Я делаю запрос к базе данных firebird, и есть несоответствие с результатом в PHP. В DB результат просто прекрасен, но когда дело доходит до PHP, существуют разные значения.Не получать правильные данные из базы данных firebird при использовании 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 = 546552 Дата = 23.10.2015 Имя = Математика (тест), География (тест)

Результат в PHP:

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

Я использую "UTF-8" кодирование при подключении к БД с ibase_connect() кодирование базы данных WIN1251.

ответ

3

Результат LIST() является блобом, а не CHAR или VARCHAR. Я сам не использую PHP, но я считаю, что драйвер Firebird/Interbase для PHP требует, чтобы вы явно запрашивали blob.

Значения, которые вы видите для ID и Name, являются идентификаторами blob, которые могут использоваться для запроса блоб.

У вас есть два варианта:

  1. Запрос значение BLOB с помощью этих двоичных объектов идентификаторов, см ibase_blob_open и ibase_blob_get (AFAIK, вам нужно будут сделать правильные байты для преобразования символов самостоятельно)
  2. Cast значения к VARCHAR (например CAST(LIST(t."ID", ',') AS VARCHAR(2048)) AS ID)

недостатком второго варианта является то, что если вы можете иметь очень длинные результаты, то вы также должны бросить в длинный VARCHAR, в противном случае вы получите ошибки усечения; и, к сожалению, varchars ограничены 32K-2 байтами (8191 символов для UTF8) и строкой в ​​целом до 64K байтов.

+0

Это сработало. Спасибо! – yovko