2014-10-08 6 views
0

У меня есть таблица Users с одной колонкой user типа VARCHAR(15). Я могу вставить период в него:Как правильно хранить и получать IP-адреса?

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

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

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

или

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

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

MySQL возвратил пустой набор результатов (то есть нулевые строки). (Query took 0.0001 sec)

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

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

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

UPDATE: Я проверил в базе данных, созданной в командной строке с таблицей:

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

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

table

+0

Позвольте мне знать, если это помогло вам. – Prix

+0

Дорогой @Prix, это очень полезно, спасибо вам большое! Он работает безотказно и эффективно! Предполагаю, вы участвуете в SQL Fiddle? Я собираюсь сделать пожертвование. –

+0

@Prix, сделано - еще раз спасибо! –

ответ

0

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

See example here.

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

See example here.


Не используйте 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') 

Live DEMO.

+0

Внимание: адреса IPv6 не работают :-) Он делает «null»! Следует упомянуть в это время и для «новых» технологий. –

+1

@DennisZiolkowski Поскольку OP хранит IPv4, а не IPv6, было бесполезно сказать, судя по его размеру столбца, независимо от того, я обновил его, чтобы отразить его для IPv4 – Prix