Как правильно хранить и получать 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')