MySQL больше, чем с отметкой времени microtime
У меня есть один скрипт PHP, вставляющий строки в базу данных MySQL. У каждой строки есть поле "create_at", которое заполняется значением функции PHP microtime (true) и вставляется как двойное число. (микротайм, потому что мне нужно что-то более точное, чем второе)
У меня есть другой сценарий PHP, который выбирает строки на основе этого поля созданного.
Когда я иду вперед и выбираю так:SELECT * FROM `ms_voltage` WHERE created_at > 1302775523.51878
Я получаю результирующий набор с первой строкой, в которой находится строка с именно этим значением для create_at.
Это происходит из моего скрипта PHP и изнутри PhpMyAdmin при выполнении запроса вручную. Но не всегда, не для каждой ценности. Только один раз, правда.
Как это возможно? Я не просил больше / равно, я хочу строго больше чем. Может быть, я что-то упускаю из виду?
3 ответа
Да, арифметика с плавающей точкой иногда может это сделать. Чтобы понять почему, полезно понять, что точно так же, как не все числа могут быть точно представлены в базе 10, не все числа также могут быть точно представлены в базе 2.
Например, "1/3" может быть записано в базе 10 как 0,33333 или 0,33334. Ни один из них не является действительно "правильным"; они просто лучшее, что мы можем сделать. "ДВОЙНОЙ" в базе 10 может быть 0,3333333333 или 0,3333333334, что является двойной цифрой, но все еще не "правильно".
Наилучшие варианты - либо использовать значение DECIMAL, либо значение INT (и умножить ваши действительные значения, скажем, на 10000 или 100000, чтобы получить десятичные цифры, которые вас интересуют, в это целое число).
Тип DOUBLE представляет только приблизительные числовые значения данных. Попробуйте использовать тип DECIMAL.
Ваш столбец с плавающей точкой? Вызов microtime с помощью true дает вам значение с плавающей точкой, которое выглядит как число с плавающей точкой, которое будет иметь цифры после.51878, который вы не видите, поэтому эти цифры делают сохраненное значение больше, чем значение, которое есть в вашем запросе.
Если вам не нужен float, я бы конвертировал строковый результат в int или даже в два столбца за секунды и useconds. Затем вы можете использовать> или <для известных значений, не беспокоясь о неточности значения с плавающей запятой.