кодировка — Не удается получить правильные данные из базы данных Firebird при использовании переполнения стека

У меня очень странная ситуация. Я делаю запрос к базе данных Firebird и есть несоответствие с результатом в PHP. В БД результат просто отличный, но когда дело доходит до 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

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

4

Решение

Тип результата LIST() это капля, а не CHAR или же VARCHAR, Я сам не использую PHP, но я считаю, что драйвер Firebird / Interbase для PHP требует от вас явного запроса BLOB-объекта.

Значения, которые вы видите для ID а также Name являются идентификаторами BLOB-объектов, которые можно использовать для запроса BLOB-объектов.

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

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]