MySQL больше, чем с отметкой времени microtime

У меня есть один PHP-скрипт, вставляющий строки в базу данных MySQL. Каждая строка имеет поле «created_at», которое заполняется значением функции PHP microtime (true) и вставлено как double. (microtime, потому что мне нужно что-то более точное, чем второе)

У меня есть другой скрипт PHP, который выбирает строки на основе этого поля created_at.

Когда я иду вперед и выбираю так: SELECT * FROM `ms_voltage` WHERE created_at > 1302775523.51878 Я получаю набор результатов с первой строкой строки с таким значением для created_at.

Это происходит из моего PHP-скрипта и из PhpMyAdmin, когда вы вручную выполняете запрос. Но не всегда, не для каждой ценности. Только раз и навсегда.

Как это возможно? Я не просил больше / равно, я хочу строго больше. Могу ли я упустить что-то вроде родственного?

Да, арифметика с плавающей запятой может это делать иногда. Чтобы понять, почему, полезно понять, что так же, как не все цифры могут быть точно представлены в базе 10, не все числа могут быть точно представлены в базе 2.

Например, «1/3» может быть записано в основании 10 как 0.33333 или 0.33334. Ни один из них не является «правильным»; они просто лучшее, что мы можем сделать. «ДВОЙНОЙ» в базе 10 может быть 0,33333333333 или 0,33333333334, что вдвое больше цифр, но все же не «правильно».

Лучшие варианты – либо использовать значение DECIMAL , либо использовать значение INT (и умножить ваши фактические значения на, скажем, 10000 или 100000, чтобы получить десятичные цифры, о которых вы заботитесь в этом int).

Тип DOUBLE представляет только приблизительные значения числовых данных. Попробуйте использовать тип DECIMAL.

Является ли ваша точка с плавающей точкой? Вызов microtime с true дает вам float и выглядит как float, который будет содержать цифры после .51878, которые вы не видите, поэтому эти цифры делают хранимое значение больше, чем значение, которое у вас есть в вашем запросе.

Если вам действительно не нужен float, я бы преобразовал результат строки в int или даже два столбца в секундах и секундах. Затем вы можете использовать> или <по известным значениям, не беспокоясь о неточности значения с плавающей запятой.