Стандартные типы PHP и PostgreSQL в результате запроса.Почему это всегда строки? - PullRequest
3 голосов
/ 19 января 2012

Используя стандартный драйвер php5-pgsql , я получаю, что, по крайней мере, с настройками php по умолчанию в ubuntu 10.04, значения результата не отображаются на стандартные типы php.То есть

  • postresql :: integer => php :: int
  • postresql :: real => php :: float
  • etc

И вернуть значения результата, приведенные к строкам.Иногда это создает сильную головную боль, когда локаль системы не совпадает с локалью базы данных и т. Д.

Можно ли как-нибудь получить соответствующий кастинг в php?Если нет, то любая идея о том, почему очень приветствуется!

РЕДАКТИРОВАТЬ:

PDO решил "postresql :: integer => php :: int", но ненапример"postresql :: real => php :: float", кажется, из-за того, что PDO использует родные драйверы, то есть pgsql, как я понимаю.Проблема с кодированием не является проблемой в моем случае, единственная необходимость состоит в том, чтобы отображать типы точно или хотя бы как можно ближе!

$sql = 'SELECT integer_field, numeric_field_10_2 FROM table';
foreach ($dbh->query($sql) as $row) {
    var_dump($row);
}
----------------------------------------
array(4) {
  ["integer_field"]=>int(79)
  ["numeric_field_10_2"]=>string(6) "100.12"
}

Спасибо, я.

1 Ответ

3 голосов
/ 19 января 2012

Это проблема, унаследованная от C API, а также от клиентского протокола postgres.Результаты предоставляются в виде строк в бэкэнд-библиотеке.Это не должно быть проблемой с совместимыми кодировками, но вы правы, это может быть проблемой.

Вы можете использовать ручное приведение или доверять автомату в php, но настоящая проблема - просто получитьнастройка кодировки правильно.Вы можете установить кодировку postgres для каждой базы данных или для каждого кластера, я лично рекомендую использовать UTF-8.

Преобразование существующей базы данных довольно хлопотно, обычно включает полный дамп и полный импортв новую базу данных.

pg_client_encoding сообщит вам текущую кодировку postgres, но не поможет с кодировкой php.Если вы не можете использовать совместимую кодировку, возможно, стоит создать оболочку, которая использует iconv для преобразования строковых данных.

Наконец, вы можете использовать альтернативную клиентскую библиотеку.Я считаю, что библиотека PDO postgres для php справляется с этим лучше.

http://us.php.net/manual/en/book.pdo.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...