MySQL больше, чем с отметкой времени microtime - PullRequest
1 голос
/ 14 апреля 2011

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 14 апреля 2011

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

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

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

4 голосов
/ 14 апреля 2011

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

2 голосов
/ 14 апреля 2011

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

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

...