Как правильно хранить и получать IP-адреса?

У меня есть стол Users с одним столбцом user типа VARCHAR(15), Я могу вставить точку в него:

INSERT INTO `LJ`.`Users` (`user`) VALUES ('.')

Теперь я хочу найти этот период:

SELECT * FROM `Users` WHERE `user` LIKE '.'

или же

SELECT * FROM `Users` WHERE `user` = '.'

В обоих случаях существующая запись не найдена:

MySQL вернул пустой набор результатов (т. Е. Ноль строк). (Запрос занял 0,0001 сек)

Та же проблема с запятой.

На самом деле, я собираюсь хранить IP-адреса, например 125.50.75.80, но проблема сводится к невозможности поиска знака препинания. Я старался '\.' Также безрезультатно.

И это проблема с литералами; что делать с переменными, содержащими строки с точками?

ОБНОВЛЕНИЕ: я проверил в базе данных, созданной в командной строке с таблицей:

CREATE TABLE LJ.Users ( user VARCHAR(15) );

и все работает нормально. Я подозреваю, что что-то не так в моей базе данных, созданной с помощью phpMyAdmin:

Таблица

1 ответ

Решение

Текущая проблема с вашим VARCHAR столбец - это тип сортировки, который вы используетеarmscii8_general_ciкоторый преобразует некоторые из сохраненных символов, таких как запятая и точка.

Смотрите пример здесь.

Возможно, вы хотели использоватьutf8_general_ciчто даст желаемый результат:

Смотрите пример здесь.


Не использоватьVARCHAR для хранения IPv4 используйте INT unsignedи тогда вы можете использоватьINET_ATON()а такжеINET_NTOA() функции для возврата / вставки / сравнения IPv4.

CREATE TABLE users
(
    user_ip INT unsigned
);

Затем для вставки IPv4 вы должны использовать:

INSERT INTO users (user_ip) VALUES (INET_ATON('125.50.75.80'));

Тогда вы можете прочитать это так:

SELECT INET_NTOA(user_ip) FROM users WHERE user_ip = INET_ATON('125.50.75.80')

Живая ДЕМО.

Другие вопросы по тегам