Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > PDO округляет float значения


Автор: solenko 29.1.2009, 07:18
Здравствуйте.
Простейший код для воспроизведения бага (или может это фича?)

Код

CREATE TABLE test(
 f1 float
);

Код

$pdo = new PDO($dns, $username, $password);
$sql = 'INSERT INTO test VALUES (?)';
$stmt = $pdo->prepare($sql);
$params = array('1.1111111111111111111');
$stmt->execute($patams);

Код

SELECT * FROM test;

В результате получаем в базе число, округденног до шестого знака после запятой. 

Вопрос -- как можно обойти это опругление или, по крайней мере, задать его точность?

Добавлено через 1 минуту и 20 секунд
Кстати, такое впечатление, что для бинда параметров внутри PDO используется все та же sprintf:
Код

echo sprintf('%f', 1.1111111111111111111);

Автор: krundetz 29.1.2009, 08:48
solenko, у FLOAT есть аргумен размера определяющий максимальную точность, видимо по умолчанию это FLOAT(6), попробуй указать большую точность. Возможно стоит посмотреть в сторону типа данных REAL

Автор: solenko 29.1.2009, 08:51
Цитата(krundetz @  29.1.2009,  07:48 Найти цитируемый пост)
у FLOAT есть аргумен размера определяющий максимальную точность, видимо по умолчанию это FLOAT(6)

такого нет. Если у вас при создании таблицы определилась точность -- ругайте свой mysql клиент.

Еще раз повторяю, проблемма именно в PDO. Это прекрастно видно в снифере/логе запросов

Автор: bars80080 29.1.2009, 10:06
Цитата(solenko @  29.1.2009,  07:51 Найти цитируемый пост)
такого нет

в смысле нет? я всегда создаю поле для цен в формате float(12, 2) , где 2 - количество знаков после запятой

Автор: krundetz 29.1.2009, 12:54
Цитата(solenko @  29.1.2009,  08:51 Найти цитируемый пост)
такого нет.

кури мануалы, все там есть
Цитата(solenko @  29.1.2009,  08:51 Найти цитируемый пост)
Еще раз повторяю, проблемма именно в PDO. Это прекрастно видно в снифере/логе запросов

так у тебя PDO выполняет роль клиента? Тогда вот тебе ответ:
Цитата(solenko @  29.1.2009,  08:51 Найти цитируемый пост)
Если у вас при создании таблицы определилась точность -- ругайте свой mysql клиент.

Ты хоть попробовал указать явно точность?

Автор: solenko 29.1.2009, 17:22
bars80080, 
Цитата

видимо по умолчанию это FLOAT(6),

Цитата

 я всегда создаю поле для цен в формате float(12, 2)

Нет никаких умолчаний, если не указана точность.

Цитата

так у тебя PDO выполняет роль клиента?

При вставке -- да. При создании таблиц -- нет.

Цитата

Ты хоть попробовал указать явно точность?

А ты хоть пробовал прикинуть как это работает? PDO НЕ выполняет describe перед каждым запросом, PDO НЕ знает ничего о структуре таблиц, вставка вручную с консоли проходит с необходимой точностью.

Предложения по теме будут?

Автор: skyboy 29.1.2009, 18:59
Цитата(solenko @  29.1.2009,  07:51 Найти цитируемый пост)
Это прекрастно видно в снифере/логе запросов

можно привести пример?

Автор: solenko 29.1.2009, 19:48
skyboy, пример вы получите если выполните код. Кусок из "боевого лога" выглядит:
Код

INSERT INTO `side` (`poly_id`, `a`, `b`, `c`) VALUES ('429', '0.000858', '0.000099', '-0.018798')

При этом в execute передаются (var_dump($params))
Код

array(4) {
  [0]=>
  int(429)
  [1]=>
  float(0.0008576239377)
  [2]=>
  float(9.91682471E-5)
  [3]=>
  float(-0.0187978100315)
}

Полноценный пример на локальной машине вы сможете получить выполнив код из первого сообщения

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)