Проблемы с выборкой (SELECT INET_ATON)

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.526
Реакции
121
Код:
SELECT COUNT(*) as count FROM tbl_rev WHERE userip = INET_ATON('178.69.95.45')
Выборка равна 0. Хотя в базе все есть.
Что не так делаю?
 
userip = 2990890797

Уверен, что такой пользователь есть?
 
Не тот ip написал, ошибся:
'178.69.92.45' должно равняться 2147483647 (что есть в БД)
А как самому перегнать адрес в это integer?
ложь
Код:
mysql> SELECT INET_ATON('178.69.92.45');
+---------------------------+
| INET_ATON('178.69.92.45') |
+---------------------------+
|                2990890029 |
+---------------------------+
1 row in set

Поставь для поля userip тип Unsigned INT или BIGINT - скорее всего именно тут у тебя загвоздка
ALTER TABLE `ips` MODIFY COLUMN `userip` int Unsigned NULL;
 
ложь
Код:
mysql> SELECT INET_ATON('178.69.92.45');
+---------------------------+
| INET_ATON('178.69.92.45') |
+---------------------------+
|                2990890029 |
+---------------------------+
1 row in set

Поставь для поля userip тип Unsigned INT или BIGINT - скорее всего именно тут у тебя загвоздка
ALTER TABLE `ips` MODIFY COLUMN `userip` int Unsigned NULL;
Там столбик тако:
`userip` int(10) UNSIGNED DEFAULT NULL,
Не помогает

Походу в БД другой IP: 127.255.255.255
Видимо неправильно сохраняется.

Вопрос решился, но не полностью. Проблема была в том, что у поля int(10), я поставил 12 и все сохраняется в БД теперь правильно. А сколько максимально нужно, чтобы сохранять все, какие только могут быть IP у посетителей сайта ?
 
Последнее редактирование модератором:
Походу в БД другой IP: 127.255.255.255
Видимо неправильно сохраняется.
Мускуль втихую "обрезал" при сохранении из-за недостаточный длинны поля. Поэтому и ловим "ложь" при сравнении.
Вопрос решился, но не полностью. Проблема была в том, что у поля int(10), я поставил 12 и все сохраняется в БД теперь правильно. А сколько максимально нужно, чтобы сохранять все, какие только могут быть IP у посетителей сайта ?
Максимум это
SELECT INET_ATON('255.255.255.255') #4294967295
и хоть прям этот IP вряд ли когда-то словите так как он сервисный, поле с типом int UNSIGNED как раз тютелька в тютельку ;)
 
Ширина int(10) или int(12) тут не причем, а вот unsigned - да.

Для просмотра ссылки Войди или Зарегистрируйся

Доказательство на примере int(1)

Код:
mysql> show create table ips;
+-------+-----------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                        |
+-------+-----------------------------------------------------------------------------------------------------+
| ips   | CREATE TABLE `ips` (
  `userip` int(1) unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> select userip, INET_NTOA(userip) from `ips`;
+------------+-------------------+
| userip     | INET_NTOA(userip) |
+------------+-------------------+
| 2990890029 | 178.69.92.45      |
| 4294967295 | 255.255.255.255   |
| 2990890797 | 178.69.95.45      |
+------------+-------------------+
3 rows in set (0.00 sec)

mysql> SELECT COUNT(*) as count FROM ips WHERE userip = INET_ATON('178.69.95.45');
+-------+
| count |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

То что наблюдалось - ошибка в наблюдении. Или интеллектуальный драйвер PHP какой-нибудь так "урезал" при вставке.
 
Только осталось за кадром, как данные попали в БД.
Тогда тупой вопрос. Что означает цифра в скобках int(1)? Насколько я знаю, это кол-во знаков. А как туда поместилось кучу цифр?
 
Последнее редактирование:
Только осталось за кадром, как данные попали в БД.
Тогда тупой вопрос. Что означает цифра в скобках int(1)? Насколько я знаю, это кол-во знаков. А как туда поместилось кучу цифр?
Это количество добавленных ноликов перед цифрой:
Для просмотра ссылки Войди или Зарегистрируйся

А за количество байт и соответственно максимальное значения поля int отвечают другие типы поля - tinyint, smallint, mediumint, bigint - Для просмотра ссылки Войди или Зарегистрируйся
 
Это количество добавленных ноликов перед цифрой:
Для просмотра ссылки Войди или Зарегистрируйся

А за количество байт и соответственно максимальное значения поля int отвечают другие типы поля - tinyint, smallint, mediumint, bigint - Для просмотра ссылки Войди или Зарегистрируйся
Понял, что не понял, как говорят... а зачем вообще указывать это число, особенно в столбцах id (уникальный ключ)?
И в итоге то что делать в моем случае? :)
 
Назад
Сверху