webew
Войти » Регистрация
 
PHP
MySQL/MariaDB

Неявное преобразование чисел в строки в PHP в результатах запроса к MySQL

26 июня 2011, 4:33
Автор: 1234ru
Неявное преобразование чисел в строки в результатах запроса к MySQL

При работе с MySQL в PHP следует помнить, что числа в результатах запроса неявно преобразуются в строки:

$result = mysql_query("SELECT 0, 0.000");
$row = mysql_fetch_row($result);
var_dump($row);

Оба числа в итоге оказались строками:
array(2) {
  [0]=>
  string(1) "0"
  [1]=>
  string(5) "0.000"
}

Это может приводить к неожиданному поведению программ, когда нужно проверить значение на пустоту.

Не беда, если сравнение происходит с целым числом — в этом случае сравнение даст ожидаемый результат:

echo ($row[0])
    ? '0 is NOT FALSE!'
    : '0 is FALSE (OK)';
// выведет '0 is FALSE (OK)'


К FALSE приводится и нулевая величина с плавающей точкой:

echo (0.000)
    ? '0.000 is NOT FALSE!'
    : '0.000 is FALSE (OK)' ;
// 0.000 is FALSE


Однако следующая конструкция даст результат, противоположный ожидаемому:

echo ($row[1]) // тут 0.000 из MySQL
    ? '0.000 from MySQL is NOT FALSE!'
    : '0.000 from MySQL is FALSE (OK)' ;
// 0.000 from MySQL is NOT FALSE!


Поэтому при подобных проверках чисел с плавающей точкой следует всегда явно приводить их к своему типу:

echo (floatval($row[1])) // тут 0.000 из MySQL
    ? 'floatval of 0.000 from MySQL is NOT FALSE!'
    : 'floatval of 0.000 from MySQL is FALSE (OK)' ;
// floatval of 0.000 from MySQL is FALSE (OK)
Добавить комментарий
NO USERPIC

rgbeast

Интересная особенность PHP. Например, python сохраняет тип (см. hello mysql). Вот пример (таблица a с одним int и одним float).

! /usr/bin/env python
import sys
import MySQLdb
conn = MySQLdb.connect("localhost", "root", "", "test")
cursor = conn.cursor()
cursor.execute("SELECT * FROM a")
rows = cursor.fetchall()
for row in rows:
    print type(row[0]),type(row[1])


Результат: <type 'long'> <type 'float'>
Результат для SELECT 0, 0.000: <type 'long'> <class 'decimal.Decimal'>

Поэтому питон предпочтительнее при чтении научных данных - неявная конверсия типа decimal при высокой точности (например, нужно 15 знаков) может привести к потере знаков, а питон сохраняет как есть в виде встроенного типа decimal.
26.06.2011, 13:48
Ответить
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: