Чудеса какие то творятся

Прислано: seaji

чт, 22/07/2010 - 19:50

Другие статьи по теме:

Внимание, вопрос к специалистам.
Кто нибудь может объяснить каким образом у меня из выражения:

<?php
$muid 
10863124257902193029;
print 
sprintf('SELECT uid FROM table WHERE muid = %d'$muid);
?>

Вдруг превратилось в:

<?php
SELECT uid FROM table WHERE muid 
2147483647
?>

Я из за этого целый час потерял. Сидел и думал, то ли лыжи не едут, то ли я е***нутый.

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано vgoodvin в чт, 22/07/2010 - 19:55.

А число меняется в друпале или уже в БД?


Опубликовано vgoodvin в чт, 22/07/2010 - 19:56.

А что с размером поля?


Опубликовано xxandeadxx в чт, 22/07/2010 - 19:58.

Цитата:

INT[(M)] [UNSIGNED] [ZEROFILL] (INTEGER[(M)] [UNSIGNED] [ZEROFILL])
Обычный целый тип. Значения - -2147483648..2147483647 и 0..4294967295 для беззнакового целого.

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html


Опубликовано seaji в чт, 22/07/2010 - 20:03.

"vgoodvin" написал(а):

А что с размером поля?

В базе данных это bigint(20) UNSIGNED
Но дело не в этом, до базы даже не доходит.
Замена происходит на момент подстановки числа в выражение.

См. выше, я же делаю проверку через спринтэф.


Опубликовано xxandeadxx в чт, 22/07/2010 - 20:06.

"seaji" написал(а):

Но дело не в этом, до базы даже не доходит.

<?php echo PHP_INT_SIZE?>
http://ru2.php.net/manual/en/language.types.integer.php


Опубликовано seaji в чт, 22/07/2010 - 20:18.

PHP_INT_SIZE: 4

И что это значит?
Он мне сконвертил в 10 знаков


Опубликовано graker в чт, 22/07/2010 - 20:23.

4 - это 4 байта, 32 разряда. Максимальное значение, соответственно, (2^31-1), минимальное - (-2^31). А 10 знаков - это в десятичной системе счисления. Тогда как компутер все считает в двоичной.


Опубликовано seaji в чт, 22/07/2010 - 21:10.

"graker" написал(а):

4 - это 4 байта

Почему байта, а не бита?
к тому же 2^32 = 4294967296
толучается что 4294967296 по Юниксу придет конец света?

Чем дальше тем страньше.

date('d-m-Y', 4294967296) показывает 31-12-1969

а сегодня 1279832203


Опубликовано graker в чт, 22/07/2010 - 21:14.

seaji написал(а):

Почему байта, а не бита?

Потому что байта. 4 байта, 32 бита. Столько занимает в памяти стандартный писишный int. Не обижайся, но вообще-то любой уважающий себя программист должен такие вещи знать.

Цитата:

к тому же 2^32 = 4294967296

Я написал (2^31-1), а не 2^32. Вторая половина (от 0xffffffff до 0x80000000) выделена под отрицательные числа, это же не unsigned int. Был бы беззнаковый - тогда да, максимум бы был (2^32-1).


Опубликовано natbampo в пт, 23/07/2010 - 05:47.

Все дело в типах данных php.

<?php
echo PHP_INT_MAX'<br>'// 2147483647
$muid 2147483647;
echo 
$muid' - ',gettype($muid), '<br>'// целое
$muid 2147483648;
echo 
$muid' - ',gettype($muid), '<br>'// вещественное
$muid 10863124257902193029;
echo 
$muid' - ',gettype($muid), '<br>';
echo 
sprintf('SELECT uid FROM table WHERE muid = %f'$muid) , '<br>'// формат не пойдет
echo sprintf('SELECT uid FROM table WHERE muid = %s'number_format($muid'''')) , '<br>'// из-за точности число не совпадает
?>

Для точности при вычислениях с большими числами см. это:
http://php.su/functions/?cat=bc

"seaji" написал(а):

Чем дальше тем страньше.

date('d-m-Y', 4294967296) показывает 31-12-1969

а сегодня 1279832203

функция date ожидает целое число, а иначе - преобразовывает. Преобразование идет по кругу:

<?php
echo (int)(2147483647 1),'<br>';
echo (int)(
2147483647 2),'<br>';
?>

Выведет:
-2147483648
-2147483647


Опубликовано seaji в пт, 23/07/2010 - 08:32.

Ну да, это все хорошо когда знаешь в чем дело.
А я вчера почувствовал себя как тот мужик, который хотел забор поставить.
Измерил длину рулеткой получилось 12 метров.
Заказал 4 секции по 3 метра.
Поставил - не сходится, остается лишних пол метра забора.
Еще раз измерил - 12 метров.
Измерил каждую секцию - 3 метра.
Посчитал секции - 4 штуки.
Столбиком умножил 3 на 4, получилось 12
Ставит забор - не сходиться.
Позвал всех соседей, все считали и умножали.
А в итоге все оказалось просто.
Жена красила потолок и испачкала рулетку и аккуратно вырезала из нее 50 см и склеила.


Новое на сайте

Ссылки партнёров